ITPub博客

首页 > 移动开发 > ANDROID > Android自定义view中,onDraw和onLayout对比

Android自定义view中,onDraw和onLayout对比

原创 ANDROID 作者:山有木xi 时间:2021-03-28 14:39:29 0 删除 编辑

在Android的各个view中,要想显示出来就必须经过测量,布局和绘制这几个过程

onMeasure

onMeasure的作用是测量控件的大小,当我们创建一个View(调用构造方法)的时候其实是不需要测量控件的大小,只有将这个view放入一个父控件中的时候才需要测量,而这个测量方法就是父控件唤起调用的。当控件的父控件要放置该控件的时候,父控件会调用子控件的onMeasure方法询问子控件的大小,这并不是本篇文章的主角,因为onMeasure在自定义view中是永远无法避免的,也不是最占资源的

onLayout

onLayout实际上比onMeasure要简单的多了,它的作用就是决定和改变控件的位置,因为不是所有的控件都需要默认的位置(左上角)或者直接match_parent,这个时候onLayout的作用就出来了,就是布局

onDraw

说完测绘,说完布局,就要说说最重要的一点,那就是绘制onDraw——绘制view,它的作用是将自定义View画出,它的大致步骤可以分为

  1. 绘制背景
  2. 绘制自己的内容(onDraw())
  3. 绘制子view(dispatchDraw())
  4. 绘制装饰

而在draw里面,也可以设置控件的位置,因为它是通过画笔画出来的,既然是通过

canvas?.drawBitmap(bitmap, src, dst, paint)

那就理所应当的可以设置位置,对于需要绘制的控件较少的自定义view来说,其实是差别不大,但是在我之前的一个项目中,需要绘制大概接近100个控件,这个时候如果还是采用postInvalidate来重新调用onDraw,就非常的消耗性能

这是我收集到不同布局的数据,单位为毫秒(ms),可以看到,在相同布局下,onDraw所耗时比onLayout要多上许多,同样的消耗资源也要多上许多,这就导致了较为严重的卡顿,也就是说,在我们不改变布局的样式大小的情况下,只是修改其位置,直接通过属性动画改变其layout中的值,其实会带来更好的体验

来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/69917874/viewspace-2765313/ ,如需转载,请注明出处,否则将追究法律责任。

下一篇: Android中invalidate
请登录后发表评论 登录
全部评论
Oracle OCA(Java),IBM高级工程师认证,中国软件行业人才(高级c语言),高级Android工程师,对数据库并发与性能调优也有一定了解

注册时间:2019-04-25

  • 博文量
    147
  • 访问量
    390768