android自定義控件基礎

看了 這篇博客後,自己對自定義控件做的一些總結。 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數值了。如:

  1.  titleTextSize = a.getDimensionPixelSize(  
  2.                 attr, (int) TypedValue.applyDimension(  
  3.                         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個參數的構造函數

 public MyView(Context context, AttributeSet attrs) {  
        super(context, attrs);  
        paint = new Paint();  
          
        TypedArray a = context.obtainStyledAttributes(attrs,R.styleable.MyView);      
        int textColor = a.getColor(R.styleable.MyView_myColor, 003344);  
        float textSize = a.getDimension(R.styleable.MyView_myTextSize, 33);  
        paint.setTextSize(textSize);  
        paint.setColor(textColor);  
        a.recycle();  
    }  


第3個參數不熟,傳style的吧貌似


如果在Code中實例化一個View會調用第一個構造函數,如果在xml中定義會調用第二個構造函數,而第三個函數系統是不調用的,要由View(我們自定義的或系統預定義的View,如此處的CustomTextView和Button)顯式調用,比如在這裏我們在第二個構造函數中調用了第三個構造函數,並將R.attr.CustomizeStyle傳給了第三個參數。

  第三個參數的意義就如同它的名字所說的,是默認的Style,只是這裏沒有說清楚,這裏的默認的Style是指它在當前Application或Activity所用的Theme中的默認Style,以系統中的Button爲例說明。




自己總結的一些,不知道對不對,有問題歡迎指出。

發佈了21 篇原創文章 · 獲贊 1 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章