1、自定义控件
android提供了大量标准的控件:TextView、EditText、Button等。在某些场景下,可能不能满足设计要求,所以需要开发自己定义控件。
会遇到的问题:
(1)性能。继承于View,继承得越多,性能就可能会降低。View嵌套View会变慢。
(2)布局嵌套复杂
(3)需要手绘界面
2、View的生命周期
体验View的生命周期
MyView.java
(1)Constructor表示构造,在布局中插入一个tag,这个tag就是一个控件,表示要来调用constructor。
(2)parent calls addView(),表示父元素会调用addView方法,将该控件,挂到父元素下。
(3)onAttachedToWindow()。表示整个界面附加到窗口时提供了一个回调方法。
(4)measure().android os会根据界面元素的布局信息,来整体测量,目的是把界面元素都绘画出来,绘画过程需要考虑每个元素的布局大小,这个过程就是一个measure。经过measure后,当前控件,绘制的大小就会明确。
(5)onMeasure(),回调,当测量完毕后,执行该方法。
(6)layout(),表示android os,开始布局。根据计算出来的大小,开始绘制界面
(7)onLayout().回调,表示布局结束后,执行该方法。
(8)dispatchDraw().android os,开始绘制
(9)draw(),android os,绘制
(10)onDraw(),回调,表示绘制完毕了,执行该方法。
(11)invalidate(),重新绘制。让android os重新开始绘制
(12)requestLayout(),重新测量,重新绘制。
3、创建一个最简单的自定义控件。
(1)必须继承View
(2)对于view构造函数要全部创建。保证layout中可以由xml代码转换成java代码。
(3)需要同步一下
(4)在Layout中引用该自定义控件,需要带上全路径的类名。
【案例】自定义控件
项目结构:
MyView.java
activity_main.xml
效果:
4、自定义控件中,使用xml文件方式插入控件时,如何添加自定义属性?
步骤:
(1)在values文件夹下建立attrs.xml
(2)在其中创建Styleable资源
(3)在这个Styleable资源中创建自定义属性,并指定该属性的数据类型,通过format。
(4)在Layout中引用自定义控件时,可以指定自定义属性app:XXX
(5)在自定义控件中获取自定义属性的值,是通过构造函数中attrs来获取属性值
项目结构:
attrs.xml
activity_main.xml
MyView.java
日志:
【案例】继续改造自定义控件
修改onDraw
activity_main.xml
效果:
5、onMeasure方法
是一个测量布局方法执行后的回调方法,用于提供给开发者设置当前自定义控件的size
注意:
使用该方法,最后需要执行setMeasuredDimension(width,height),让设定的size生效。
MeasureSpec的mode有3种:
(1)Exactly,精确尺寸
(2)At Most,最大尺寸
(3)Unspecified,未指定
【案例】体验测量
日志: