看了 這篇博客後,自己對自定義控件做的一些總結。 http://blog.csdn.net/carrey1989/article/details/11757409
關於自定義控件的創建,主要分爲以下幾個步驟:
1. 在value文件夾下,創建attrs.xml文件,在其中聲明 自定義控件的名字以及各種屬性。
<declare-styleable name="控件名稱">
<attr name="屬性名" format="屬性類型"/>
2. 創建自定義控件的類文件,通常是繼承View。重寫其中的幾個方法
A.在構造函數中,通過TypeArray獲取控件的所有屬性,進行畫筆paint以及其他一些屬性初始化,獲取完畢後需要進行recycle。
在設置字體屬性的時候,涉及單位轉換,可以使用:TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_SP, 25,getResources().getDisplayMetrics()),返回的就是25sp對應的px數值了。如:
- titleTextSize = a.getDimensionPixelSize(
- attr, (int) TypedValue.applyDimension(
- TypedValue.COMPLEX_UNIT_SP, 25, getResources().getDisplayMetrics()));//默認標題字體大小25sp
B.重寫onMeasrue方法,這個方法的作用主要是用於計算出自定義控件的寬和高。
一般都要先獲取控件在佈局文件layout中自己設置的模式及寬高。(這是我自己的理解)
通過int widthMode = MeasureSpec.getMode(widthMeasureSpec);
int widthSize = MeasureSpec.getSize(widthMeasureSpec);
int heightMode = MeasureSpec.getMode(heightMeasureSpec);
int heightSize = MeasureSpec.getSize(heightMeasureSpec);
模式有3中,EXACTLY(具體的android:layout_width="200dp"),
UP_MOST(具體的android:layout_width="wrap_content"),
UNSPECIFIED(具體的不太懂 ,想多大 就多大),
其中的一些方法:
FontMetrics,用於獲取字體屬性panit.getFontMetrics
TextUtils.ellipsize,用於獲取Text中的文本信息。String msg = TextUtils.ellipsize(subTitleText, textPaint, right - left, TextUtils.TruncateAt.END).toString();
C.重寫onDraw方法,進行自定義控件的繪製。
其中的一些方法:
canvas.drawText(msg, x, bottom - fm.descent, paint);繪製文本。
canvas.drawBitmap(imageBitmap, null, rect, paint);繪製圖片。
D.設置一些接口,可以通過接口對自定義的屬性進行修改。
3.在佈局文件中使用自定義控件,在開頭進行聲明。
xmlns:自己定個名字="http://schemas.android.com/apk/res/app的包名" as中好像要將最後的/換成-
4.關於自定義控件的3個構造方法
在代碼裏new的話一般用一個參數的,
寫在xml裏的 調用2個參數的 attr裏邊傳過來的是 xml裏邊對應的height width等參數,包括自己定義的參數,如果在xml裏邊寫入自定義控件的話 必須要重寫2個參數的構造函數
第3個參數不熟,傳style的吧貌似
如果在Code中實例化一個View會調用第一個構造函數,如果在xml中定義會調用第二個構造函數,而第三個函數系統是不調用的,要由View(我們自定義的或系統預定義的View,如此處的CustomTextView和Button)顯式調用,比如在這裏我們在第二個構造函數中調用了第三個構造函數,並將R.attr.CustomizeStyle傳給了第三個參數。
第三個參數的意義就如同它的名字所說的,是默認的Style,只是這裏沒有說清楚,這裏的默認的Style是指它在當前Application或Activity所用的Theme中的默認Style,以系統中的Button爲例說明。
自己總結的一些,不知道對不對,有問題歡迎指出。