安卓自定义View进阶-分类与流程

本文详细介绍了Android自定义View的分类及其核心方法,包括构造函数、onMeasure、onLayout及onDraw等,并提供了自定义View的开发流程指导。

参考文章:
GcsSloop
教你搞定Android自定义View
frank909

一.自定义View分类

1.自定义ViewGroup

自定义ViewGroup一般是利用现有的组件根据特定的布局方式来组成新的组件,大多继承自ViewGroup或各种Layout,包含有子View。

2.自定义View
在没有现成的View,需要自己实现的时候,就使用自定义View,一般继承自View,SurfaceView或其他的View,不包含子View。

二、几个重要的方法

这里写图片描述

1、构造函数

构造函数是View的入口,可以初始化一些数据和获取自定义的属性
View构造函数有四个重载方法:

这里写图片描述

有四个参数的构造函数在API21才引入的,暂不考虑
有三个参数的构造函数中第三个参数是默认的Style,这里的默认的Style是指它在当前Application或Activity所用的Theme中的默认Style,且只有在明确调用的时候才会生效,以系统中的ImageButton为例说明:

这里写图片描述

注意:即使你在View中使用了Style这个属性也不会调用三个参数的构造函数,所调用的依旧是两个参数的构造函数。

还剩下两个构造函数:

这里写图片描述

以下方法调用的是一个参数的构造函数:

MyCustomView myView=new MyCustomView(this)

以下方法调用的是两个参数的构造函数:

<com.sloop.study.MyCustomView
android:layout_width"wrap_content"
android:layout_height"wrap_content"/>

2.测量View大小(onMeasure)

View的大小不仅由自身所决定,同时也会受到父控件的影响,为了我们的控件能更好的适应各种情况,一般会自己进行测量。
测量View大小使用的是onMeasure函数,我们可以从onMeasure的两个参数中取出宽高的相关数据:
这里写图片描述

从上面可以看出 onMeasure 函数中有 widthMeasureSpec 和 heightMeasureSpec 这两个 int 类型的参数, 毫无疑问他们是和宽高相关的, 但它们其实不是宽和高, 而是由宽、高和各自方向上对应的测量模式来合成的一个值:

测量模式一共有三种, 被定义在 Android 中的 View 类的一个内部类View.MeasureSpec中:
1、UNSPECIFIED:

这个模式下,View想多大就多大,通常在绘制自定义View时才会使用

2、EXACTLY

就是 精确值模式
当我们的View的layout_width 或者 layout_height属性设置为具体的数值(例: android:layout_width = “100dp”)
或者指定为 “match_parent” 时(这时候系统会自动分配为父布局的大小)
就是使用的这个模式

3、AT_MOST

就是 最大值模式
当我们的View的layout_width 或者 layout_height属性设置为 “wrap_content” 时
也就是控件的大小随着子控件或者内容的变化而变化,这时候只要控件的尺寸不超过父布局允许的最大尺寸即可

在实际运用之中只需要记住有三种模式,用 MeasureSpec 的 getSize是获取数值, getMode是获取模式即可

注意:

如果对View的宽高进行修改了,不要调用super.onMeasure(widthMeasureSpec,heightMeasureSpec);
要用setMeasuredDimension(widthsize,heightsize);
这里写图片描述

3、确定子View布局位置(onLayout)

确定布局的函数是onLayout,它用于确定子View的位置,在自定义ViewGroup中会用到,他调用的是子View的layout函数

在自定义ViewGroup中,onLayout一般是循环取出子View,然后经过计算得出各个子View位置的坐标值,然后用以下函数设置子View位置。

child.layout(l, t, r, b);

这里写图片描述

4、绘制内容(onDraw)

onDraw是实际绘制的部分,也就是我们真正关心的部分,使用的是Canvas绘图。

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas);
    }

三、自定义View流程:

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值