view測量與繪制
view的測量
MeasureSpec:
定義:由SpecMode(int)于SpecSize(int)打包成一個int值(避免過多的對象內(nèi)存分配)浪慌。它是一個32位(4字節(jié))的int值冤荆,高2位是specMode(測量模式),低30位是 specSize(測量的大腥ㄏ恕)钓简。
功能:很大程度決定一個view的尺寸規(guī)格。
SpecMode:
定義:測量模式(分三種)
1.EXACTLY:layout_width或者layout_height為具體數(shù)值或者match_parent時汹想,使用這種模式外邓,此時的view為SpecSize所指定的大小。
2.AT_MOST:layout_width或者layout_height為wrap_content時古掏,父容器給出了測量大小SpecSize损话,但是具體大小還是要根據(jù)子控件內(nèi)容來調(diào)控(只要不超過父控件測量的最大尺寸即可)。
3.UNSPECIFIED:
父容器不指定大小冗茸,一般用于系統(tǒng)內(nèi)部的測量席镀。
onMeasure:
重寫onMeasure( )方法需要調(diào)用setMeasureDimension最終將測量后的值設(shè)置上。
ViewGroup的測量
通常需要重寫onLayout方法確認位置夏漱,一般不需要繪制(onDraw),但是會調(diào)用dispatchDraw()來繪制其子view顶捷。
注:無論是測量還是布局位置挂绰,還是繪制,viewGroup都是遍歷子view服赎,獲取每一個子view的數(shù)據(jù)(onMeasure和onLayout)或調(diào)用子view的方法(onDraw)葵蒂。
View的繪制
onDraw:
1.canvas:
裝載畫布:Canvas canvas = new Canvas(bitmap);
canvas與bitmap有關(guān)聯(lián)繪制操作都是作用在這個bitmap上的。
2.自定義控件:
View中重要的回調(diào)方法:
onFinishInflate():從XML加載組件后調(diào)用重虑。
onSizeChanged():組件大小變化時回調(diào)践付。
onMeasure():需要測量view大小時回調(diào)。
onLayout():確定顯示位置時回調(diào)缺厉。
onTouchEvent():監(jiān)聽觸摸時間回調(diào)永高。
三種自定義控件的方法
1.對現(xiàn)有控件進行拓展
2.通過組合的方式實現(xiàn)新的控件
3.重寫view來實現(xiàn)全新的控件
事件攔截機制:
ViewGroup:dispatchtouchEvent —> onInterceptTouchEvent —>onTouchEvent
view: dispatchtouchEvent —>onTouchEvent
注:這三個方法的返回值: true-不傳遞 false-傳遞