咱們要知道佈局是否合理,能夠經過Hierarchy Viewer這個工具。打開Hierarchy Viewer(定位到tools/目錄下,直接執行hierarchyviewer的命令,選定須要查看的Process,再點擊Load View Hierarchy會顯示出當前界面的佈局Tree。在每一個模塊的Traffic light上有三個燈,分別表明了Measure, Layout and Draw三個步驟的性能。若是有紅燈了,那麼就說明這裏有點問題,須要優化。canvas
若是你在佈局中在LinearLayout中使用了layout_weight。咱們須要仔細評估究竟是否須要使用那樣的佈局,儘可能避免使用layout_weight。由於這樣會計算兩次。ide
若是你想要觀察和解決過分繪製,又一個簡單實用的竅門是移除Window默認的Background,而後在佈局文件中進行添加背景。工具
canvas.clipRect()這個方法可讓你選擇你須要繪製的區域,這裏能夠是Rect也能夠是path,能夠方便簡單的解決自定義view過分繪製的問題。佈局
這個方法能夠指定一塊矩形區域,只有在這個區域內纔會被繪製,其餘的區域會被忽視。
除了clipRect方法以外,咱們還可使用canvas.quickreject()來判斷是否沒和某個矩形相交,從而跳過那些非矩形區域內的繪製操做。性能
例子:優化
若是一個自定義view是這樣繪製的ui
private Paint mPaint; private Bitmap mBitmap; private int mPadding = 0; public CView(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); mPaint = new Paint(); mBitmap = BitmapFactory.decodeResource(getResources(), R.drawable.kale); } @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < 2; i++) { canvas.save(); Rect rect = new Rect(mPadding, 0, 100 + mPadding, mBitmap.getWidth() + mPadding); canvas.drawBitmap(mBitmap,mPadding,0,mPaint); canvas.restore(); mPadding += 100; } canvas.drawBitmap(mBitmap, mPadding, 0, mPaint); } }
那麼檢測到的狀況以下:spa
能夠很明顯的看到有重疊的部分,重疊的部分出現了嚴重的紅色。那麼當咱們用clipRect來指定view繪製的區域後會如何呢?rest
能夠很明顯的看見重疊的部分沒有了,緣由就是咱們在代碼中指定了只繪製可見的部分,重疊的不可見部分不會去繪製。code
@Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); for (int i = 0; i < 2; i++) { canvas.save(); Rect rect = new Rect(mPadding, 0, 100 + mPadding, mBitmap.getWidth() + mPadding); canvas.clipRect(rect); canvas.drawBitmap(mBitmap,mPadding,0,mPaint); canvas.restore(); mPadding += 100; } canvas.drawBitmap(mBitmap, mPadding, 0, mPaint); }