更新:2017-1-28 理解一
概述
- 第一行代碼(第二版)
- Android研究院之應用程序ListView 詳解 (六)
其中在自定義ListView中涉及到如何動態加載佈局,即XML流→實例化佈局得到View對象,便於實現該佈局中的各個控件。
以及:
- Android視圖繪製流程完全解析,帶你一步步深入瞭解View(二)(
未看完,見下理解一)
View的繪製流程:onMeasure()、onLayout()和onDraw()
ListView工作原理
ListView性能優化
理解一、Android視圖繪製流程
onMeasure()具體步驟:
http://blog.csdn.net/u013480581/article/details/54783399
更新:2017-1-30
onLayout()具體步驟:
ViewRoot的performTraversals()方法會在measure結束後繼續執行,並調用View的layout()方法。
- 實現host.layout(0, 0, host.mMeasuredWidth, host.mMeasuredHeight); 四個參數,分別代表着左、上、右、下的座標(相對於當前視圖的父視圖而言),其中measure中測量得到的寬度和高度
layout()方法中,首先會調用setFrame()方法來判斷視圖的大小是否發生過變化,需不需要重繪
- layout()方法中,onLayout(changed, l, t, r, b)方法回調
- View中的onLayout()方法就是一個空方法
- ViewGroup中的onLayout()方法竟然是一個抽象方法protected abstract void onLayout(boolean changed, int l, int t, int r, int b);
- ViewGroup的子類都必須重寫這個方法。LinearLayout和RelativeLayout在內部按照各自的規則對子視圖進行佈局
getWidth()方法和getMeasureWidth()方法的區別
- getMeasureWidth()方法在[1.4]measure()過程結束後就可以獲取到了,而getWidth()方法要在[2.1]layout()過程結束後才能獲取到。
- getMeasureWidth()方法中的值是通過[1.7]setMeasuredDimension()方法來進行設置的,而getWidth()方法中的值則是通過視圖右邊的座標減去左邊的座標計算出來的。
onDraw()具體步驟:
具體見:(引用)http://blog.csdn.net/xx326664162/article/details/49494207