View的繪製須要通過哪些過程?php
measure:測量View的寬和高android
有哪些經常使用回調方法?git
比較重要的概念github
DecorView:頂級View面試
View的繪製流程的詳細流程是怎樣的?技術博客大總結canvas
View的繪製流程是從ViewRoot的PerformTraversals方法開始的。大概的流程以下所示segmentfault
View的繪製流程主要分爲三步:性能優化
onDraw:繪製最終的視圖,首先ViewRoot建立一個Canvas對象,而後調用onDraw()方法進行繪製。onDraw()方法的繪製流程爲markdown
invalidate() postInvalidate()ide
requestLayout()
如何選擇
requestLayout()什麼時候不會觸發onDraw()?
invalidate()在什麼狀況下不會觸發onDraw?
如何讓ViewGroup在invalidate時會觸發onDraw?技術博客大總結
本質須要將ViewGroup的dirtyOpaque設置爲false
DecorView的做用是什麼?
DecorView中如何獲取ContentView以及Activity所設置的View?
ViewRootIml如何和DecorView創建聯繫?技術博客大總結
同時會建立ViewRootImpl,調用ViewRoot的setView方法將ViewRootImpl和DevorView創建關聯
root = new ViewRootImpl(view.getContext(), display); root.setView(view, wparams, panelParentView);
ViewRoot爲何要和DecorView創建關聯
getWidth()方法和getMeasureWidth()區別呢
getMeasureWidth()
public final int getMeasuredWidth() { return mMeasuredWidth & MEASURED_SIZE_MASK; }
getWidth()
@ViewDebug.ExportedProperty(category = "layout") public final int getWidth() { return mRight - mLeft; }
爲何有時候用getWidth()或者getMeasureWidth()獲得0
解釋:技術博客大總結
解決控件測量寬高問題
@Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); test(); } @Override public void onWindowFocusChanged(boolean hasFocus) { super.onWindowFocusChanged(hasFocus); getWidth(4); } private void test(){ getWidth(1); marqueeView.measure(0, 0); getWidth(2); marqueeView.post(new Runnable() { @Override public void run() { getWidth(3); } }); } private void getWidth(int a){ int width2 = marqueeView.getWidth(); int measuredWidth2 = marqueeView.getMeasuredWidth(); Log.e(a+"MainActivity-----",width2+"-----"+measuredWidth2); } //11-28 17:03:17.559 15990-15990/com.yc.cn.ycbanner E/1MainActivity-----: 0-----0 //11-28 17:03:17.567 15990-15990/com.yc.cn.ycbanner E/2MainActivity-----: 0-----760 //11-28 17:03:17.684 15990-15990/com.yc.cn.ycbanner E/3MainActivity-----: 960-----960 //11-28 17:03:17.685 15990-15990/com.yc.cn.ycbanner E/4MainActivity-----: 960-----960
何時測量寬高不等於實際寬高?
平時寫的自定義控件有哪些?
如何優化自定義 view
View的繪製流程說一下?
自定義View的注意點?
View的wrap_content和match_parent效果一致的緣由分析?
getDefaultSize方法的處理邏輯?
getDefaultSize: 根據建議獲取的最小寬高和測量規格,決定實際的測量寬高
View的getDefaultSize源碼要點(決定了View寬高的測量值)
ViewGroup(抽象類)的measure流程?
getChildMeasureSpec獲取子元素MeasureSpec的要點?
LinearLayout的onMeasure()分析
View的layout過程?
View的layout()源碼分析?
LinearLayout的onLayout方法?
View的測量寬高和最終寬高有什麼區別?技術博客大總結
draw的過程步驟是什麼?
View特殊方法setWillNotDraw是幹什麼用的?
View中x,y,translationX,translationY分別是什麼?
View平移時是否改變了left、top等原始參數?技術博客大總結
MeasureSpec是什麼?
MeasureSpec的組成?
測量模式SpecMode的類型和具體含義?技術博客大總結
MeasureSpec和LayoutParams的對應關係?
如何獲取View的測量寬/高?
如何在Activity啓動時得到View的寬/高?
Activity中得到View寬高的4種辦法?技術博客大總結
onWindowFocusChanged
view.post(runnable)
ViewTreeObserver
Activity啓動到最終加載ViewRoot(執行三大流程)的流程是什麼?
自定義View性能優化有哪些?
避免過分繪製
儘可能減小或簡化計算
避免建立大量對象形成頻繁GC
禁止或避免I/O操做
onDraw中避免冗餘代碼、避免建立對象
複合View,要減小布局層級。
狀態和恢復和保存
合理使用invalidate的參數版本。技術博客大總結
減小冗餘代碼:不要使用Handler,由於已經有post系列方法
使用的線程和動畫,要在onDetachedFromWindow中進行清理工做。
要妥善處理滑動衝突。