自定义View的最基本的三个方法分别是: onMeasure()、onLayout()、onDraw(); View在Activity中显示出来,要经历测量、布局和绘制三个步骤,分别对应三个动作:measure、layout和draw。
测量:onMeasure()决定View的大小;
布局:onLayout()决定View在ViewGroup中的位置;
绘制:onDraw()决定绘制这个View。
提示:以下是本篇文章正文内容,下面案例可供参考
MeasureSpec是一个32位的int值,前2位是SpecMode,表示测量模式,后30位是SpecSize,表示在某种测量模式下的规格大小。
View类中有下面三个方法:
public static int getMode(int measureSpec) 测量模式(可取以下三种测量模式)
public static int getSize(int measureSpec) 测量的大小(具体值)
public static int makeMeasureSpec( int size, int mode) 提供一个标准的大小值和模式的 MeasureSpec
三种测量模式:
代码如下(示例):
protected void onLayout(boolean changed, int left, int top, int right, int bottom) {}
源码注释:
从布局调用时,该视图应该为每个子元素分配一个大小和位置。派生类的子类应该重写这个方法和调用layout在每个自己的孩子。
changed 这是这个视图的新尺寸或位置
left 相对于父节点的左侧位置
top 相对于父节点的顶部位置
right 相对于父节点的右侧位置
bottom 相对于父节点的底部位置
view 的 layout 方法确定了 view 的4个点的位置,注意这4个参数是对应 view 坐标系的 left ,top ,right ,bottom 4个值,在我们自己需要使用这个方法时,应该知道4个坐标值表示什么,怎么算
最后我们要知道父控件会计算出子 view 的位置坐标,然后统一遍历所有的子 view ,执行他们的 layout 方法已决定他们的位置。
对于多View的视图他的结构是树形结构,最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View。
这个树的概念很重要,因为无论我们是在测量大小或是调整布局的时候都是从树的顶端开始一层一层,一个分支一个分支的进行(树形递归)。
代码如下(示例):
protected void onDraw(Canvas canvas) {}
canvas 将在其上绘制背景的画布
如以下方法:
canvas.drawLine() 画直线
canvas.drawCircle() 画圆
canvas.drawPath() 画路径
canvas.drawRect() 画正方形
等…
以上就是自定义view的基础内容,本文仅仅简单介绍了自定义view的执行流程,仅供参考,如有错误,不吝赐教。
参考: