view的绘制流程:onMeasure---onLayout---onDraw
第一步:onMeasure:测量view大小。从顶层父view到子view递归调用measure,measure方法回调onMeasure
第二步:onLayout:确定view位置,进行页面布局。从顶层父view向子view递归调用view.layout方法的过程,父view根据上一次measure子view获得的布局大小和布局参数,把view放置在合适的位置。
第三步:onDraw:绘制视图。viewRoot创建一个canvas,然后调用onDraw方法。
共六个步骤:
1.绘制视图背景
2.保存画布图层
3.绘制view的内容
4.绘制view子视图(如果没有,就不画)
5.还原图层
6.绘制滚动条
1.减少不必要的代码:对于频繁调用的方法,需要尽量减少不必要的代码。
2.不在 onDraw 中做内存分配的事:先从 onDraw 开始,需要特别注意不应该在这里做内存分配的事情,因为它会导致 GC,从而导致卡顿。在初始化或者动画间隙期间做分配内存的动作。不要在动画正在执行的时候做内存分配的事情。
3.降低view的刷新频率,尽可能减少不必要的调用invalidate()方法。或是调用带四种参数不同类型的invalidate(),而不是调用无参的方法。无参变量需要刷新整个view,而带参数的方法只需刷新指定部分的view。
4.使用硬件加速,GPU硬件加速可以带来性能增加。(View的布局类型设置为 LAYER_TYPE_HARDWARE)
5.状态保存与恢复,如果因内存不足,Activity置于后台被杀重启时,View应尽可能保存自己属性,可以重写onSaveInstanceState和onRestoreInstanceState方法,状态保存。
参考文章
https://blog.csdn.net/github_37130188/article/details/89111512