View篇(一):玩一下自定義ViewGroup
自定義ViewGroup可不像自定義View那麼簡單
今日聚焦:
1.自定義ViewGroup中花樣佈局子View2.移動View用layout、translation、TranslationAnimation、ViewPropertyAnimator、scrollTo、scrollBy有什麼區別?3.ViewGroup裡怎麼給孩子加動畫4.慣性移動? 也許你可以瞭解一下複製程式碼
效果 1

效果 2

一、前置知識:
1.生命函式
這是我曾經測試畫出的一張圖,描述了ViewGroup+兩個孩子的生命函式呼叫情況
在這補充一點,ViewGroup在沒有背景時不會走onDraw方法,但可以走dispatchDraw原因在於View對onDraw的控制時做了限定:[if(!dirtyOpaque) onDraw(canvas)] 你可以使用onDraw,在之前設個透明色即可:setBackgroundColor(0x00000000);

2.View與Activity之間
貌似一直沒有對Activity與View的生命週期一起做過測試
測試之後發現View載入完成之後(onFinishInflate)並未立即回撥測量、佈局、繪製
而是在onResume之後View才會回撥onAttachedToWindow-->onMeasure-->onSizeChanged-->onLayout-->onDraw
這一點確實讓我挺驚訝,以前竟然沒注意,現在理清了,通暢很多
2019-02-19 16:50:29.998 : onCreate --------------
2019-02-19 16:50:29.992 : 建構函式: 0
2019-02-19 16:50:29.996 : onFinishInflate: 0
2019-02-19 16:50:33.001 : onStart: ...................
2019-02-19 16:50:33.006 : onResume: ...................
2019-02-19 16:50:33.050 : onAttachedToWindow:
2019-02-19 16:50:33.207 : onMeasure: 0
2019-02-19 16:50:33.243 : onMeasure: 0
2019-02-19 16:50:33.354 : onSizeChanged: 1948
2019-02-19 16:50:33.358 : onLayout: 1948
2019-02-19 16:50:33.395 : onDraw: 1948
二、自定義ViewGroup (排兵佈陣)
經測試發現注意點:
[1].必須onMeasure中測量孩子的尺寸,否則無法顯示
[2].必須onLayout中佈局孩子的位置,否則無法顯示
[3].在onLayout中孩子不能用view.getHeight()獲取尺寸(因為為0),只能用view.getMeasuredHeight複製程式碼
1.最簡形式的ViewGroup
這裡使用介面卡模式,跟ListView一個套路,其實是非常簡單,看箭頭所指
這裡暫時不對ViewGroup進行測量,先填滿。對子View用自帶的測量方法measureChildren

2.佈局子view
這裡關鍵在排布這裡給張圖先:子View佈局的左上右下



3.放置成圓形



4.新增點選事件
這就比較容易了,一個監聽搞定


5.陣列點陣定位
這突然讓我想到一個好玩的東西,那就是點陣控位。
點陣控位可以使用二維陣列,也可以使用字串,也可以使用畫素點。
具體的可以詳見我的 這篇 :這裡就放一張核心的分析圖:我們這裡不畫圓,而是取點位



ok了,只要把1放在你想要的位置,子View就在那裡,
不過簡單一點的還好說,要是愛心...來看神技:
5.點陣圖點陣定位
用黑白(就相當於上面1,0)來標識點位,再根據Bitmap的畫素進行
Bitmap記憶體殺手? 7*7畫素的Bitmap也就九牛一毛...
就是下面的小不點,你可以下載玩玩。有PS,你也可以用ps自己戳點


到這裡排兵佈陣就結束了,相信對onLayout已經能玩的6了吧,接下來上陣殺敵。
二.移動測試篇
既然是測試,就一切從簡,直切問題本身,這裡新建了一個Activity
並且打開了手機自帶的佈局便界顯示,這樣更能說明問題所在
1.佈局
自定義:TestViewGroup+TestView純原生,不加防腐劑
為了說明問題,這裡的TestViewGroup加了邊距


2.程式碼實現

3.移動:layout與translation
這樣對比應該非常明顯:layout真的把佈局移動了,translation只是離家出走而已
layout-----

translation

點選事件在綠色上點選事件在綠色上

4 : 移動動畫和屬性動畫
移動動畫都是從家裡開始,屬性動畫移動從當前位置,但是家還在那裡!
也就是傳說中的屬性動畫也並無法改變View的佈局位置
TranslationAnimation

ViewPropertyAnimator

點選事件在家裡點選事件在綠色上

5:哥就像讓View搬家動畫怎麼辦?
很簡單:ValueAnimator唄,在重新整理時對layout進行更新
由於有四個setXXX方法,這裡,簡單一點,使用ObjectAnimator


6:scrollTo和scrollBy
可以說這兩個方法和上面的不是一輩的人,應用場景有很大區別
這兩個方法是移動一個View內部的所有子View,呼叫方並非子View
至於To和By的區別,也是老生常談,看圖體悟吧...
scroll

ToscrollBy

Ok ,基礎知識就到這裡
最後附上小編整理出來的Android相關的學習思維導圖,讓大家有個學習的方向,早日拿到大廠的offer。
Android進階

Android前沿技術

Flutter

移動架構師


需要這些安卓學習資料和麵試資料的大夥需要的關注+點贊+加群:185873940 免費獲取!
群內還有許多免費的關於高階安卓學習資料,包括高階UI、效能優化、架構師課程、 NDK、混合式開發:ReactNative+Weex等多個Android技術知識的架構視訊資料,還有職業生涯規劃及面試指導。