Android中 View的绘制分为三步。

  1. measure —— 用于得知(子)View的大小
  2. layout —— 摆放好(子)View的位置
  3. draw —— 真正绘制View的内容

因为Android的layout系统是一个考虑好相对布局的一个系统,我们知道ViewGroup是继承于View的,思想上可以把ViewGroup当成是一个View的组合

我们看看在三个函数里分别做了什么。

onMeasure

这个函数主要传入两个参数

javavoid onMeasure(int widthMeasureSpec, int heightMeasureSpec)

一个代表宽度的参数,一个代表高度的参数。
这里的宽度参数是父容器的一些参数,它并不仅仅是数值,它用了位运算,根据相应的掩码能得到父容器能给与子容器的宽度,有EXACTLY,UNSPECIFIEDAT_MOST三个值,分别说明:

  1. EXACTLY 父容器希望子视图有它指定的大小
  2. UNSPECIFIED 父容器可以无限容纳子容器,子视图要多大都可以
  3. AT_MOST 父容器指定了最大的大小,让子视图自行决定大小。

根据这些算出大小后,父容器就知道自己应该占多少的空间,同时报告给它的父容器,在这个时候,也可以把子容器应该有的大小记下来,一会在onLayout中用。

onLayout

这个函数声明如下:

javavoid onLayout(boolean changed, int l, int t, int r, int b)

第一个参数表明大小位置是否变动过,剩下的4个参数分别代表该容器的lefttoprightbottom,容器可以根据这个参数,直接得出它现在的宽度,高度,位置等,如果它是一个ViewGroup,那么它可以根据这些参数为它的子视图进行布局。

onDraw

好了,这个是最后的一个步骤了,就是画。
传入的参数就是Canvas 一个画布,你可以在这个画布上绘制你要的各种样式,
这时候调用getWidthgetHeight都是安全的,因为已经经过了onLayout的步骤了。

以上是Android中自定义View最重要的三个步骤,理解了这三步,就在准确的位置,准确的大小画出你想要的图形了。

更多相关文章

  1. Android(安卓)实现QQ第三方登录
  2. 性能优化——Android图片压缩与优化的几种方式
  3. Android积木之图片的生成和保存
  4. android 开发使用 kotlin 进行点击事件监听和界面跳转,直接传也方
  5. android 存储操作 大小显示换算 kb mb KB MB 读取
  6. Android两种播放声音的方式
  7. android okgo post传数组
  8. mybatisplus的坑 insert标签insert into select无参数问题的解决
  9. Python技巧匿名函数、回调函数和高阶函数

随机推荐

  1. [置顶] Android Makefile分析
  2. Android使用NFC模拟M卡实现 (一)
  3. Android(安卓)Context对象
  4. [Android 新特性] Android 4.3新功能(正式
  5. Android学习路线_入门篇(一)编写简单的APP
  6. android通过USB使用真机调试程序
  7. android 横向,竖向滚动Gridveiw
  8. Android APK反编译详解(附图)
  9. 隐藏Android(安卓)系统自带的v7.widget.T
  10. Android webView 正确的用法