安卓自定义View - 基础

文章目录

  • 前言
  • 一、onMeasure (测量)
  • 二、onLayout (布局)
      • 用下面的坐标图可以更直观的理解:
  • 三、onDraw (绘制)
  • 总结


前言

自定义View的最基本的三个方法分别是: onMeasure()、onLayout()、onDraw(); View在Activity中显示出来,要经历测量、布局和绘制三个步骤,分别对应三个动作:measure、layout和draw。
测量:onMeasure()决定View的大小;
布局:onLayout()决定View在ViewGroup中的位置;
绘制:onDraw()决定绘制这个View。


提示:以下是本篇文章正文内容,下面案例可供参考

一、onMeasure (测量)

认识MeasureSpec(测量规则):

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

三种测量模式:

  1. UNSPECIFIED (不确定)
    任意大小,想要多大就多大,尽可能大,一般我们不会遇到,这种情况一般用于系统内部,如ListView,RecyclerView,ScrollView测量子View的时候给的就是UNSPECIFIED 我们在开发过程中基本用不到。
  2. EXACTLY (精确的)
    父容器已经检测出View所需要的精确大小,这个时候View的最终大小就是SpecSize所指定的值。如:layout_width=“100dp”,“match_parent”,“fill_parent”。
  3. AT_MOST (至多)
    父容器指定了一个可用大小即SpecSize,View的大小不能大于这个值,包裹内容,比如在布局中你是这样写的layout_width=“wrap_content”。

二、onLayout (布局)

代码如下(示例):

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 - 基础_第1张图片

对于多View的视图他的结构是树形结构,最顶层是ViewGroup,ViewGroup下可能有多个ViewGroup或View。
这个树的概念很重要,因为无论我们是在测量大小或是调整布局的时候都是从树的顶端开始一层一层,一个分支一个分支的进行(树形递归)。

安卓自定义View - 基础_第2张图片
Layout的作用就是为整个View树计算实际的位置,而通过刚才对View树的介绍知道,想计算整个View树的位置,就需要递归的去计算每一个子视图的位置(Measure同理)。

三、onDraw (绘制)

代码如下(示例):

protected void onDraw(Canvas canvas) {}

canvas 将在其上绘制背景的画布
如以下方法:
canvas.drawLine() 画直线
canvas.drawCircle() 画圆
canvas.drawPath() 画路径
canvas.drawRect() 画正方形
等…


总结

以上就是自定义view的基础内容,本文仅仅简单介绍了自定义view的执行流程,仅供参考,如有错误,不吝赐教。

参考:
https://www.jianshu.com/p/653a86fe450f
https://blog.csdn.net/zenmela2011/article/details/109744695
http://events.jianshu.io/p/d77e60478b27

你可能感兴趣的:(View,安卓,android,java)