Google I/O 2013 - Custom View筆記
- View的繪製流程可以直接draw(),但也可以先onMeasure()再onLayout()再draw(),onMeasure()和onLayout()一定會是同步發生。
- 要客製化做出自已的View,一定是implements ViewGroup。
- ViewGroup不僅是一個容器,還是一個管理子View的控件。
- 客製View的第1個流程︰requestLayout() - 這個函式告訴系統你現在有一個View需要被計算和繪製。
- 把requestLayout()想成是一個草稿,在這個時間點你可以改變你的View大小、可以改變View在hierachy的層級⋯等等。
- 呼叫了requestLayout()後,對於整個View的層級影響是很大的,它可以影響到它的父視圖的計算、父父視圖的顯示⋯。
- 客製View的第2個流程︰實作onMeasure() - 用這個函式來決定你的View的大小,還有你這個View之後裝的子View的大小。
- onMeasure()是一個不斷循環的函式(recursive process)
- onMeasure()的責任是要去找出並量出子View的合適大小
- 量出View的大小的方法︰MeasureSpec
- MeasureSpec的第1種工具︰精確的指定大小(MeasureSpec.EXACTLY)
- MeasureSpec的第2種工具︰依子View的大小做判斷給出理想範圍(MeasureSpec.AT_MOST)
- MeasureSpec的第3種工具︰不指定大小(MeasureSpec.UNSPECITIED),最常見的例子就是ScrollView和ListView。
- 客製View的第3個流桯︰onLayout() - 將你在onMeasure()裡定義好的大小,去計算所有子View即將存放的螢幕所在位置。
- ViewGroup專用的尺寸定義工具︰LayoutParams
- 如果沒有指定LayoutParams,如果你用的是FrameLayout,那麼系統會配予match_parent屬性。
- Drawing - Android的介面渲染工具。
- invalidate(),跟requestLayout()不同的地方在於,如果你的View有動畫、有變形...,可以使用這個函式來請求重繪。
- 使用Drawing渲染工具的方式 - 實作函式onDraw()
- 如果你的View都會由子View去繪圖,那麼就可以setWillNotDraw(true)讓系統去跳過onDraw()這個流程。
- dispatchDraw()被負責繪製子view,包含變形、動畫⋯等等的事件。
No comments:
Post a Comment