一炸渡、自定義Viewhttps://blog.csdn.net/u014005316/article/details/54616393
1.自定義View的繪制流程
1.走構(gòu)造函數(shù)(對View進行初始化)
2.onMeasure(測量View的大小)
3.onSizeChange(確定View的大小)
4.onLayout(確定子View的大心纫凇(包含子View的時候使用))
5.onDraw(實際繪制內(nèi)容)
6.如果視圖狀態(tài)改變(用戶操作或自身變化引起)進行重繪 調(diào)用invalidate方法
二.自定義View的分類:
自定義ViewGroup
自定義ViewGroup一般是利用現(xiàn)有的組件根據(jù)特定的布局方式來組成新的組件,大多繼承自ViewGroup或各種Layout蚌堵。
自定義View
在沒有現(xiàn)成的View买决,需要自己實現(xiàn)的時候,就使用自定義View吼畏,一般繼承自View督赤,SurfaceView或其他的View。
三.細講View流程方法
1.構(gòu)造函數(shù)
構(gòu)造函數(shù)是View的入口泻蚊,可以用于初始化一些的內(nèi)容躲舌,和獲取自定義屬性,View的構(gòu)造函數(shù)有四種重載
1.有三個參數(shù)的構(gòu)造函數(shù)中第三個參數(shù)是默認的Style性雄,這里的默認的Style是指它在當前Application或Activity所用的Theme中的默認Style没卸,且只有在明確調(diào)用的時候才會生效
2.有兩個個參數(shù)的構(gòu)造函數(shù)一般在layout文件中使用的時候會調(diào)用羹奉,關(guān)于它的所有屬性(包括自定義屬性)都會包含在attrs中傳遞進來。
3.有一個參數(shù)的構(gòu)造函數(shù)中一般在直接New一個View的時候調(diào)用约计。
2.測量View的大芯魇谩(onMeasure)
1.View的大小不僅由自身所決定,同時也會受到父控件的影響煤蚌,為了我們的控件能更好的適應(yīng)各種情況耕挨,一般會自己進行測量。
2.onMeasure 函數(shù)中有 widthMeasureSpec 和 heightMeasureSpec 這兩個 int 類型的參數(shù)尉桩, 毫無疑問他們是和寬高相關(guān)的俗孝, 但它們其實不是寬和高, 而是由寬魄健、高和各自方向上對應(yīng)的測量模式來合成的一個值
3.測量模式一共有三種赋铝, 被定義在 Android 中的 View 類的一個內(nèi)部類View.MeasureSpec中
1.UNSPECIFIED:默認值,父控件沒有給子view任何限制沽瘦,子View可以設(shè)置為任意大小革骨,一般不會用到,使用場景是系統(tǒng)內(nèi)部
2.EXACTLY:表示父控件已經(jīng)確切的指定了子View的大小析恋,一般設(shè)置為Match_Parent或50dp精確的值良哲。
3.AT_MOST:表示子View具體大小沒有尺寸限制,但是存在上限助隧,上限一般為父View大小筑凫,一般設(shè)置為warp_content。
4.注意: 用 MeasureSpec 的 getSize是獲取數(shù)值并村, getMode是獲取模式巍实。如果對View的寬高進行修改了,不要調(diào)用 super.onMeasure( widthMeasureSpec, heightMeasureSpec); 要調(diào)用 setMeasuredDimension( widthsize, heightsize); 這個函數(shù)哩牍。
3.onSizeChange:
1.在測量完View并使用setMeasuredDimension函數(shù)之后View的大小基本上已經(jīng)確定了棚潦,那么為什么還要再次確定View的大小呢?
這是因為View的大小不僅由View本身控制膝昆,而且受父控件的影響,所以我們在確定View大小的時候最好使用系統(tǒng)提供的onSizeChanged回調(diào)函數(shù)荚孵。
2.它又四個參數(shù)妹窖,分別為 寬度收叶,高度,上一次寬度,上一次高度谒麦。
這個函數(shù)比較簡單俄讹,我們只需關(guān)注 寬度(w), 高度(h) 即可哆致,這兩個參數(shù)就是View最終的大小绕德。
4.onLayout:
1.確定布局的函數(shù)是onLayout摊阀,它用于確定子View的位置耻蛇,在自定義ViewGroup中會用到胞此,他調(diào)用的是子View的layout函數(shù)臣咖。
2.在自定義ViewGroup中,onLayout一般是循環(huán)取出子View漱牵,然后經(jīng)過計算得出各個子View位置的坐標值夺蛇,然后用以下函數(shù)設(shè)置子View位置。child.layout(l, t, r, b); l是 View左側(cè)距父View左側(cè)的距離酣胀。
5.onDraw:
1.invalidate在子線程進行重繪
2.postinvalidate在主線程進行重繪?