需求
在開發中,我們可能時常會碰到這樣的需求,諸如:
- 監聽地圖縮放等級變化
- 監聽控件中的畫面變化
- 監聽ViewGroup中的節點變化
一般方法
很多時候,控件和類庫並沒有爲我們提供統一的回調方法來監聽這些事件
一般我們解決的方法就是,開一個線程,每隔1秒或100毫秒就去重新查詢下界面內容
然後通過代碼手動去判斷界面是否變化,再根據判斷結果處理相關業務
這樣做雖然可以實現功能,但是有兩個明顯的缺點
- 代碼顯得很不正規,給人一種投機取巧的感覺
- 即使界面一個小時不更新,我們仍然需要不斷的查詢界面變化,很浪費性能
更好的方案
控件每次執行完onDraw繪製方法,都會觸發onDrawListener
我們通過getViewTreeObserver().addOnDrawListener(listener)就可以監聽控件是否發生了新的繪製
然後在listener中處理界面變化時的業務邏輯即可