本博客是一個純技術交流博客佣赖,寫出來的文章是幫大家解決一些問題恰矩,或讓大家有個參考和思路,更多技術分享請關注http://blog.36dr.net憎蛤,有任何問題可與我郵件dr.kalen@yahoo.com外傅。
通常APP開發(fā)會使用到Button、TextView俩檬、LinearLayout等Android自身具備的組件萎胰,在某些特殊情況我們可能需要特殊改造View甚至產生新的View,一般對自定義分為三種情況:
APP中大量使用某種界面棚辽,此界面只需要多種系統自帶View組合即可技竟,形成個人所需的組合View,因此產生一個新的layout文件和對應處理class即可重復使用屈藐,我們稱之為自定義組合View
在某些特殊需求下榔组,Android原有的組件能夠符合90%的功能,但是某個功能無法適配联逻,則只需要重新繼承原View然后重寫對應需要修改的方法即可搓扯,如使EditView支持表情圖片填充,即可對繪制部分進行重寫包归,使用span操作锨推。
所有系統組件已無法實現需求中功能,則此時需要重新定義一個View公壤,因此需要重頭到尾全新定義View測量换可,布局,繪制厦幅,事件锦担,多點觸控等
具體步驟
此部分我們僅對上面情況中第三種進行剖析,當需要完全自定義View時慨削,需要根據View具體情況做一下步驟:
測量(onMeasure)
每個View在顯示在屏幕上之前洞渔,首先得知道自身的寬高套媚,而View的寬高依賴于父控件給予的寬高空間、父控件的padding磁椒、自身控件margin等因素堤瘤,任何一個變化都會影響View的區(qū)域。
測量View寬高對應自定義View的是onMeasure方法浆熔,此方法在測量時會被反復調用多次本辐,同時當其他View變化時也會導致自身onMeasure被調用,用于調整自身區(qū)域医增。
通過測算和邏輯運算將自身和子控件的寬高計算完之后慎皱,通過setMeasuredDimension方法進行設置自身區(qū)域和調用子空間的measure方法,此時測量工作就結束叶骨。
布局(onLayout)
有了onMeasure方法對View的測量值茫多,接下來就需要對View布局,那么布局肯定就意味著需要l,r,t,b的值才能定位一個View在屏幕中的位置忽刽,View的布局是基于父控件坐標系天揖,也就是說自身View的坐標系是在父控件基礎上,不管父控件如何移動自身View相對于父控件的坐標偏移量用于不變跪帝。
布局View是通過View中onLayout方法今膊,同樣父控件的位置對布局也會有影響,因此此方法也會被調用多次當屏幕中有組件變化時伞剑,通過邏輯運算之后得到View的具體位置斑唬,然后使用View的layout方法設置子空間位置,而自身位置由父控件決定黎泣。
繪制(onLayout)
通常測量
和布局
就可以產生一個自定義View恕刘,某些特殊情況會使用繪制,如畫板聘裁。
繪制方法為onDraw雪营,通過canvas、Paint等工具自定義View的畫面衡便,當然同樣可能會使用到測量和布局中的一些值献起,使用canvas中各種drawXXX方法,詳細后續(xù)會講到镣陕。
onMeasure谴餐、onLayout、onDraw它們調用順序如圖:
屬性和主題(Style)
當自定義View完成之后呆抑,不光個人使用還希望View能夠分享到其他使用岂嗓,因此需要將View中某些變量進行公開化以及提供一些便利的屬性用于XML編寫。做成一個類似系統View一樣便捷鹊碍,這才有開源的精神厌殉,不僅使用別人造的輪子食绿,自身也要會造輪子。IT有句話說“不要重復造輪子公罕,高級程序員會的只是copy”,但是造輪子的太少了器紧。
使用style定義View的屬性,同時代碼中采用Attribute讀取xml中的值楼眷,以及提供一些公開方法方便代碼直接控制View的一些參數铲汪,具體Style如何定義和代碼如何獲取請詳細閱讀深入剖析自定義View之Style。
事件(Event)
自定義View不僅需要展示罐柳,還需要進行有效控制View掌腰,如點擊事件,滑動事件等不同情況下View做出不同的效果张吉。
那么就需要對View的事件監(jiān)聽齿梁,View中onEvent也就是事件處理,通常處理Event有dispatchTouchEvent芦拿、onInterceptTouchEvent士飒、onTouchEvent方法查邢,每個方法有具體用途,根據event的x邓深,y值來邏輯運算同時改變View的x,y以達到需求目的。
事件調用順序如圖所示,具體每個含義則會在深入剖析自定義View之onEvent 詳細講述尺借。
其他:后續(xù)將陸續(xù)跟上
深入剖析自定義View之onMeasure
深入剖析自定義View之onLayout
深入剖析自定義View之onDraw
深入剖析自定義View之Style
深入剖析自定義View之onEvent