在Android的各个view中,要想显示出来就必须经过测量,布局和绘制这几个过程
onMeasure
onMeasure的作用是测量控件的大小,当我们创建一个View(调用构造方法)的时候其实是不需要测量控件的大小,只有将这个view放入一个父控件中的时候才需要测量,而这个测量方法就是父控件唤起调用的。当控件的父控件要放置该控件的时候,父控件会调用子控件的onMeasure方法询问子控件的大小,这并不是本篇文章的主角,因为onMeasure在自定义view中是永远无法避免的,也不是最占资源的
onLayout
onLayout实际上比onMeasure要简单的多了,它的作用就是决定和改变控件的位置,因为不是所有的控件都需要默认的位置(左上角)或者直接match_parent,这个时候onLayout的作用就出来了,就是布局
onDraw
说完测绘,说完布局,就要说说最重要的一点,那就是绘制onDraw——绘制view,它的作用是将自定义View画出,它的大致步骤可以分为
绘制装饰
而在draw里面,也可以设置控件的位置,因为它是通过画笔画出来的,既然是通过
canvas?.drawBitmap(bitmap, src, dst, paint)
那就理所应当的可以设置位置,对于需要绘制的控件较少的自定义view来说,其实是差别不大,但是在我之前的一个项目中,需要绘制大概接近100个控件,这个时候如果还是采用postInvalidate来重新调用onDraw,就非常的消耗性能

这是我收集到不同布局的数据,单位为毫秒(ms),可以看到,在相同布局下,onDraw所耗时比onLayout要多上许多,同样的消耗资源也要多上许多,这就导致了较为严重的卡顿,也就是说,在我们不改变布局的样式大小的情况下,只是修改其位置,直接通过属性动画改变其layout中的值,其实会带来更好的体验
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-2765313/ ,如需转载,请注明出处,否则将追究法律责任。