天天看點

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

本文是對鴻洋的Android自定義View系列的文章學習的筆記。先說自定義View的步驟:

1、自定義View的屬性

2、在View的構造方法中獲得我們自定義的屬性

3*、重寫onMesure()方法(非必需)

4、重寫onDraw()方法

一、attrs.xml檔案

在自定義View時,常用到attrs.xml檔案(位于res/values/目錄下),用來聲明我們的屬性并聲明整個樣式。如:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

attrs.xml檔案的内容結構

我們定義了字型,字型顔色,字型大小3個屬性,format是指該屬性的取值類型,attr可定義的屬性類型一共有十種:string,color,demension,integer,enum,reference,float,boolean,fraction,flag。

此時,假設已經在com.example.customview01.view包下定義了CustomTitleView類,那麼此時可以直接在布局檔案中聲明自定義的控件,如:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

布局檔案中聲明的自定義控件CustomTitleView

一定要引入命名空間(隻對目前布局檔案可用):xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"。 其中xmlns:custom中的custom是标簽名,com.example.customview01是工程包名。

二、Android布局檔案中的命名空間

android 中View對象可以在代碼中建立,也可以在布局檔案中聲明,在布局檔案中聲明時,可以在布局檔案中添加屬性,如:android:layout_width="fill_parent" 。屬性包括兩個部分:android和layout_width;android是命名空間,layout_width是屬性名。我們可以在View上添加自己聲明的屬性。要想View中自己聲明的屬性有意義,則需要為屬性加一個命名空間字首,要想使得該命名空間有效,則需要在使用該命名空間之前聲明該命名空間,如:

xmlns:custom="http://schemas.android.com/apk/res/com.example.customview01"

custom:titleText="3712"

custom:titleTextColor="#ff0000"

custom:titleTextSize="40sp" />

在實際應用中大多數的自定義命名空間都聲明在第一個元素中。

三、在View的構造方法中獲得我們自定義的屬性

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

自定義View中的構造方法

我們重寫了3個構造方法,預設的布局檔案調用的是兩個參數的構造方法,是以記得讓所有的構造調用我們的三個參數的構造(使用的是關鍵字this),我們在三個參數的構造中獲得自定義屬性。

三個參數的構造器,如圖所示:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

自定義View中的三個參數的構造器

四、重寫onDraw()方法,onMeasure()方法調用預設的

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

重寫onDraw()方法

按照文字的繪制方法:canvas.drawText(mTitleText, getWidth() /2-mBound.width() /2, getHeight() /2+mBound.height() /2,mPaint),好像是從文字的左下角開始繪制的。

此時的布局效果為:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

自定義View的效果圖

此時如果我們把布局檔案的寬和高寫成wrap_content,效果圖為:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

修改寬和高屬性後的效果圖

系統幫我們測量的高度和寬度都是MATCH_PARNET,當我們設定明确的寬度和高度時,系統幫我們測量的結果就是我們設定的結果,當我們設定為WRAP_CONTENT,或者MATCH_PARENT系統幫我們測量的結果就是MATCH_PARENT的長度。

是以,當設定了WRAP_CONTENT時,我們需要自己進行測量,即重寫onMeasure方法。

重寫之前先了解MeasureSpec的specMode,一共三種類型:

EXACTLY:一般是設定了明确的值或者是MATCH_PARENT

AT_MOST:表示子布局限制在一個最大值内,一般為WARP_CONTENT

UNSPECIFIED:表示子布局想要多大就多大,很少使用

下面是我們重寫onMeasure代碼:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

重寫onMeasure()方法

此時自定義View的效果圖為:

android螢幕錄制鴻洋,Android之自定義View筆記(鴻洋)

重寫onMeasure()方法後的效果圖

同時可以在自定義的View中添加其他的方法,使View具有自己的特征。