咱们要知道布局是否合理,能够经过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); }