深入剖析自定義View

本博客是一個純技術交流博客佣赖,寫出來的文章是幫大家解決一些問題恰矩,或讓大家有個參考和思路,更多技術分享請關注http://blog.36dr.net憎蛤,有任何問題可與我郵件dr.kalen@yahoo.com外傅。

通常APP開發(fā)會使用到Button、TextView俩檬、LinearLayout等Android自身具備的組件萎胰,在某些特殊情況我們可能需要特殊改造View甚至產生新的View,一般對自定義分為三種情況:

  1. APP中大量使用某種界面棚辽,此界面只需要多種系統自帶View組合即可技竟,形成個人所需的組合View,因此產生一個新的layout文件和對應處理class即可重復使用屈藐,我們稱之為自定義組合View

  2. 在某些特殊需求下榔组,Android原有的組件能夠符合90%的功能,但是某個功能無法適配联逻,則只需要重新繼承原View然后重寫對應需要修改的方法即可搓扯,如使EditView支持表情圖片填充,即可對繪制部分進行重寫包归,使用span操作锨推。

  3. 所有系統組件已無法實現需求中功能,則此時需要重新定義一個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它們調用順序如圖:

view.png

屬性和主題(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 詳細講述尺借。

event.png

其他:后續(xù)將陸續(xù)跟上
深入剖析自定義View之onMeasure
深入剖析自定義View之onLayout
深入剖析自定義View之onDraw
深入剖析自定義View之Style
深入剖析自定義View之onEvent

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
  • 序言:七十年代末坛吁,一起剝皮案震驚了整個濱河市玫膀,隨后出現的幾起案子解阅,更是在濱河造成了極大的恐慌蟹地,老刑警劉巖,帶你破解...
    沈念sama閱讀 216,843評論 6 502
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件,死亡現場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機撬腾,發(fā)現死者居然都...
    沈念sama閱讀 92,538評論 3 392
  • 文/潘曉璐 我一進店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來锁保,“玉大人薯酝,你說我怎么就攤上這事≌加矗” “怎么了隐绵?”我有些...
    開封第一講書人閱讀 163,187評論 0 353
  • 文/不壞的土叔 我叫張陵依许,是天一觀的道長膘婶。 經常有香客問我,道長蛀醉,這世上最難降的妖魔是什么竣付? 我笑而不...
    開封第一講書人閱讀 58,264評論 1 292
  • 正文 為了忘掉前任,我火速辦了婚禮滞欠,結果婚禮上古胆,老公的妹妹穿的比我還像新娘。我一直安慰自己筛璧,他們只是感情好逸绎,可當我...
    茶點故事閱讀 67,289評論 6 390
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著夭谤,像睡著了一般棺牧。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上朗儒,一...
    開封第一講書人閱讀 51,231評論 1 299
  • 那天颊乘,我揣著相機與錄音,去河邊找鬼醉锄。 笑死乏悄,一個胖子當著我的面吹牛,可吹牛的內容都是我干的恳不。 我是一名探鬼主播檩小,決...
    沈念sama閱讀 40,116評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼烟勋!你這毒婦竟也來了规求?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 38,945評論 0 275
  • 序言:老撾萬榮一對情侶失蹤卵惦,失蹤者是張志新(化名)和其女友劉穎阻肿,沒想到半個月后,有當地人在樹林里發(fā)現了一具尸體沮尿,經...
    沈念sama閱讀 45,367評論 1 313
  • 正文 獨居荒郊野嶺守林人離奇死亡丛塌,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 37,581評論 2 333
  • 正文 我和宋清朗相戀三年,在試婚紗的時候發(fā)現自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片姨伤。...
    茶點故事閱讀 39,754評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡哨坪,死狀恐怖,靈堂內的尸體忽然破棺而出乍楚,到底是詐尸還是另有隱情当编,我是刑警寧澤,帶...
    沈念sama閱讀 35,458評論 5 344
  • 正文 年R本政府宣布徒溪,位于F島的核電站忿偷,受9級特大地震影響,放射性物質發(fā)生泄漏臊泌。R本人自食惡果不足惜鲤桥,卻給世界環(huán)境...
    茶點故事閱讀 41,068評論 3 327
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望渠概。 院中可真熱鬧茶凳,春花似錦、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,692評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至箱沦,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間雇庙,已是汗流浹背谓形。 一陣腳步聲響...
    開封第一講書人閱讀 32,842評論 1 269
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留疆前,地道東北人寒跳。 一個月前我還...
    沈念sama閱讀 47,797評論 2 369
  • 正文 我出身青樓,卻偏偏與公主長得像峡继,于是被迫代替她去往敵國和親冯袍。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,654評論 2 354

推薦閱讀更多精彩內容