android自定義View學習(一)----建立一個檢視類
建立一個檢視類
精心設計的自定義檢視與其他精心設計的類非常相似。它使用易於使用的介面封裝了一組特定的功能,它可以高效地使用CPU和記憶體,等等。不過,作為一個設計良好的班級,自定義檢視應該:
- 符合Android標準
- 提供適用於Android XML佈局的自定義樣式屬性
- 傳送無障礙事件
- 與多個Android平臺相容。
1.子檢視
Android框架中定義的所有檢視類都會擴充套件View。你的自定義檢視也可以繼承View,或者擴充套件其中一個現有檢視子類來節省時間,例如Button。
要允許Android Studio與檢視進行互動,至少必須提供一個建構函式,該建構函式將 引數Context和AttributeSet物件作為引數。該建構函式允許佈局編輯器建立和編輯檢視的例項。
class PieChart extends View
{
public PieChart (Context context ,AttributeSet attrs ){
super (context ,attrs );
}
}
2.定義自定義屬性
要View為您的使用者介面新增內建內容,您需要在XML元素中指定它並使用元素屬性控制其外觀和行為。編寫良好的自定義檢視也可以通過XML新增和設定樣式。要在自定義檢視中啟用此行為,您必須:
- 在 資源元素中 定義檢視的自定義屬性
- 在XML佈局中指定屬性的值
- 在執行時檢索屬性值
- 將檢索到的屬性值應用於您的檢視
要定義自定義屬性,請將 資源新增到您的專案中。習慣上把這些資源放到一個res/values/attrs.xml檔案中。這是一個attrs.xml檔案的例子:
<resources>
<declare-styleable name = “ PieChart ” >
<attr name = “**showText**” format = “boolean” />
<attr name = “**labelPosition**” format = “enum” >
<enum name = “left” value = “ 0“ />
<enum name = ”right“ value = ”1“ />
</ attr>
</ declare-styleable >
</ resources>
此程式碼宣告兩個自定義屬性,showText和labelPosition 屬性名為的可修改實體PieChart。
按照慣例,可修改實體的名稱與定義自定義檢視的類的名稱相同。
儘管遵循這個約定並不是嚴格必要的,但是許多流行的程式碼編輯器依賴於這個命名約定來提供語句完成。
一旦定義了自定義屬性,就可以像使用內建屬性一樣在佈局XML檔案中使用它們。唯一的區別是自定義屬性區別於android原生的宣告。
http://schemas.android.com/apk/res/android android 原生的名稱空間
http://schemas.android.com/apk/res/[your package name] 自定義屬性的名稱空間
完整的xml程式碼
<?xml version = “1.0” encoding = “utf-8” ?>
<LinearLayout
xmlns:android = “http://schemas.android.com/apk/res/android”
xmlns:custom = “http://schemas.android .com / apk / res / com.example.customviews“ > <com.example.customviews.charting.PieChart
custom:showText = ”true“
custom:labelPosition = ”left“ />
</ LinearLayout>
為了避免重複使用長名稱空間URI,示例使用了一個xmlns指令。該指令將別名分配custom給名稱空間http://schemas.android.com/apk/res/com.example.customviews。你可以選擇任何你想要的名稱空間的別名(上面程式碼用到的別名是custom)。
注意將自定義檢視新增到佈局的XML標記的名稱。它是自定義檢視類的完全限定名稱。如果你的檢視類是一個內部類,你必須進一步用檢視外部類的名稱來限定它。進一步。例如, PieChart該類有一個名為的內部類PieView。要使用這個類的自定義屬性,你可以使用標籤com.example.customviews.charting.PieChart.PieView (內部類的寫法)
應用自定義屬性
從XML佈局建立檢視時,將從資源束中讀取XML標記中的所有屬性,並以檢視的形式傳遞到檢視的建構函式中AttributeSet。儘管可以AttributeSet直接讀取值,但這樣做有一些缺點:
- 屬性值中的資源引用未解析
- 樣式不適用
通過obtainStyledAttributes()方法進行處理可以解決上面出現的問題:
相反,傳遞AttributeSet給obtainStyledAttributes()。該方法返回TypedArray已經解除引用和樣式化的值陣列。
Android資源編譯器為您的呼叫工作做了大量工作obtainStyledAttributes() 。對於 res目錄中的每個資源,生成的R.java都定義了一個屬性ID陣列和一組定義陣列中每個屬性索引的常量。您使用預定義的常量從中讀取屬性TypedArray。以下是PieChart該類如何讀取其屬性:
public PieChart(Context context, AttributeSet attrs) {
super(context, attrs);
TypedArray a = context.getTheme().obtainStyledAttributes(
attrs,
R.styleable.PieChart,
0, 0);
try {
mShowText = a.getBoolean(R.styleable.PieChart_showText, false);
mTextPos = a.getInteger(R.styleable.PieChart_labelPosition, 0);
} finally {
a.recycle();
}
}
請注意,TypedArray物件是共享資源,使用後必須回收。
新增屬性和事件
屬性是控制檢視行為和外觀的有效方式,但只有在初始化檢視時才能讀取它們。要提供動態行為,請為每個自定義屬性公開屬性getter和setter對。以下程式碼片段顯示瞭如何PieChart公開一個名為的屬性showText:
public boolean isShowText (){
return mShowText ;
}
public void setShowText (boolean showText ){
mShowText = showText ;
invalidate ();
requestLayout ();
}
注意setShowText呼叫invalidate() 和requestLayout()。這些呼叫對於確保檢視可靠執行至關重要。在對其屬性進行任何更改後,必須使該檢視無效,這可能會改變其外觀,以便系統知道它需要重繪。同樣,如果屬性更改可能會影響檢視的大小或形狀,則需要請求新佈局。忘記這些方法呼叫會導致難以發現的錯誤。
自定義檢視還應該支援事件監聽器來傳達重要事件。例如,PieChart 公開呼叫的自定義事件OnCurrentItemChanged以通知偵聽器使用者已將餅圖旋轉到專注於新餅圖片段。
很容易忘記公開屬性和事件,特別是當您是自定義檢視的唯一使用者時。花一些時間仔細確定您的檢視介面可以減少未來的維護成本。遵循的一條好規則是始終公開影響自定義檢視的可見外觀或行為的任何屬性。