Android view架構

weixin_33727510發表於2016-05-18
1835177-1fd730aae85c2bfa.png
view system.png

view測量與繪製

view的測量
MeasureSpec
定義:由SpecMode(int)於SpecSize(int)打包成一個int值(避免過多的物件記憶體分配)。它是一個32位(4位元組)的int值,高2位是specMode(測量模式),低30位是 specSize(測量的大小)。
功能:很大程度決定一個view的尺寸規格。

SpecMode
定義:測量模式(分三種)
1.EXACTLY:layout_width或者layout_height為具體數值或者match_parent時,使用這種模式,此時的view為SpecSize所指定的大小。
2.AT_MOST:layout_width或者layout_height為wrap_content時,父容器給出了測量大小SpecSize,但是具體大小還是要根據子控制元件內容來調控(只要不超過父控制元件測量的最大尺寸即可)。
3.UNSPECIFIED:
父容器不指定大小,一般用於系統內部的測量。

onMeasure
重寫onMeasure( )方法需要呼叫setMeasureDimension最終將測量後的值設定上。

ViewGroup的測量
通常需要重寫onLayout方法確認位置,一般不需要繪製(onDraw),但是會呼叫dispatchDraw()來繪製其子view。
注:無論是測量還是佈局位置,還是繪製,viewGroup都是遍歷子view,獲取每一個子view的資料(onMeasure和onLayout)或呼叫子view的方法(onDraw)。

View的繪製
onDraw:
1.canvas:
裝載畫布:Canvas canvas = new Canvas(bitmap);
canvas與bitmap有關聯繪製操作都是作用在這個bitmap上的。

 2.自定義控制元件:
      View中重要的回撥方法:
           onFinishInflate():從XML載入元件後呼叫。
           onSizeChanged():元件大小變化時回撥。
           onMeasure():需要測量view大小時回撥。
           onLayout():確定顯示位置時回撥。
           onTouchEvent():監聽觸控時間回撥。
      三種自定義控制元件的方法
           1.對現有控制元件進行擴充
           2.通過組合的方式實現新的控制元件
           3.重寫view來實現全新的控制元件

事件攔截機制:
ViewGroup:dispatchtouchEvent —> onInterceptTouchEvent —>onTouchEvent
view: dispatchtouchEvent —>onTouchEvent
注:這三個方法的返回值: true-不傳遞 false-傳遞

相關文章