天天看點

android自定義控件(理論知識學習 +自定義屬性的講解)

android自定義控件(理論知識學習 +自定義屬性的講解)

android視圖最外層是一個window對象。

phoneWindow來實作。

phoneWindow将一個decorView作為整個布局的根view.

螢幕分為TitleView和ContentView.

ContentView的根布局為framelayout.

view的測量通過onMesure()來進行的:

onMesure用來确定視圖大小和位置。

MesureSpec用來幫助我們測量view.

<code><code></code></code>

super.onMeasure(widthMeasureSpec, heightMeasureSpec);調用setMeasureredDimension(int width,int height);将測量後的資料設定進去。

    測量模式:

    EXACTLY

    當視圖控件精确确定大小的時候,系統使用該模式,精确模式。預設支援這種模式。

    AT_MOST

    控件的layout_width和layout_height設定為wrap_layout的時候,控件尺寸不超過父控件大小。

    UNSPECIFIED

    自定義控件的使用使用,不指定view大小。

如何擷取測量模式和測量大小:

View的繪制主要是在onDraw中通過canvas(畫布)和paint(畫筆)來進行繪制操作。

如下是繪制圓形ImageView裡面onDraw方法裡面的設定:

canvas當你重寫onDraw方法的時候由系統提供,通過這個對象來進行繪制操作。

ViewGroup的寬高設定為:

的時候,ViewGroup通過周遊其下面所有組  件來确定view的大小,子view的大小通過子view的onMesure來确定。

幾乎不調用其onDraw方法進行繪制,大部分都是調用dispatchDraw()來繪制子view,周遊所有子view并進行繪制。

自定義元件幾個比較重要的方法:

onFinishInflate()從xml加載組建後進行回調。

onSizeChanged()元件大小發生變化的時候回調。

onMesure()回調進行元件大小的測量。

onLayout()确定元件的顯示位置。

onTouchEvent()确實視圖元件事件的分發處理。

自定義元件屬性以及在代碼中如何擷取已經給元件設定相關屬性内容改變元件顯示效果?

例如前面說到的自定義圓形Imageview,我們在attrs.xml檔案定義如下:

首先貼出CircleImageView的源碼,後面再講解:

CircleImageView為引用名稱

format指定屬性的類型

<code>xmlns:app="http://schemas.android.com/apk/res-auto"為自定義屬性的字首,字首為app,也就說後面自定義的屬性設定必須以app開頭,例如後面的:</code>

那麼如何在代碼中擷取屬性并設定元件屬性呢?我們看下CircleImageView元件的構造方法:

通過context.obtainStyledAttributes來擷取TypedArray對象,通過不同的方法來擷取你設定在布局檔案裡面的屬性,後面如果如下内容将擷取到的資源設定到元件上面去:

注意擷取完屬性資料後,通過recycle來回收資源。其實設定自定義屬性主要在設定屬性參數類型和在代碼中擷取屬性以及在元件上根據擷取的屬性内容設定到元件上面,并影響在元件上的顯示效果。

自定義控件之組合控件:

組合控件有兩種實作方式:

2,就是在java代碼裡面實作,其實就是xml裡面對元件的形式通過set的形式添加到元件上那種。很少這種去實作。

對于元件的點選等事件處理,一般都是些接口,接口裡面方法指向對應元件的系統點選等事件來處理。

繼續閱讀