安卓自定义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流程:

这里写图片描述

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Android进阶之光》是一本适合有一定开发基础的Android开发者阅读的书籍。该书详细并深入地讲解了Android开发者必备的和前沿的知识,有助于开发者提高技术水平。同时,该书的知识体系结构也对高级开发者有很大的帮助。 《Android进阶之光》共分为11章,每一章都包含了不同的知识点,由浅入深、环环相扣,最终形成了一个完整的体系结构。以下是各章节的简要介绍: 1. 第1章介绍了Android 5.0到Android 7.0的新特性。 2. 第2章介绍了Material Design,这是一种现代化的设计语言,用于创建美观且具有一致性的Android应用程序界面。 3. 第3章介绍了View体系,包括View的事件分发、工作流程自定义View等知识点。 4. 第4章介绍了多线程的知识,包括线程的创建、线程间的通信等。 5. 第5章介绍了网络编程与网络框架的知识,包括HTTP通信、网络请求库等。 6. 第6章介绍了常用的设计模式,如单例模式、观察者模式等,以帮助开发者编写可维护和可扩展的代码。 7. 第7章介绍了事件总线,这是一种用于组件之间通信的机制。 8. 第8到第10章介绍了架构设计所需要的知识点,包括MVC、MVP、MVVM等。 9. 第11章简单介绍了Android系统框架与MediaPlayer框架。 总的来说,《Android进阶之光》通过系统化的讲解和深入的内容,帮助Android开发者提高技术水平,并对高级开发者提供了有价值的知识。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值