attr 是 values 目录下的资源文件,新建项目是没有 attr 文件的,我们自己新建一个出来放到 values 里面就行,注意名字别写错
attr 中的自定义属性样式
Android 项目只有一个 attr.xml 文件,所有的自定义属性都写在一起,为了方便 attr 中的自定义属性以所在 view 分组存放。其中 MyView 就是这个 view 的名字,以 <declare-styleable>为标签,里面自然就是一个个自定义属性啦
细心的朋友可以发现,自定义 view 可以指定不同的数据类型,Android 中自定义属性支持的数据类型还是挺多的,详细见下表:
我这markdown 写表格bug ,所以直接用被人的图,我再补充一下:
按照下面这样写就性,enum 就能看出来这是枚举
window 会解析整个视图树并对象化,然后把每个 view 在 xml 中的属性发包成一个结合传递给相关的 view ,这个属性集合就是 TypedArray 了,我们在 view 的构造函数中可以获取 TypedArray
有一点要注意,自定义属性的 id 是系统自动生成的,id = 自定义属性组名 + "_" + 自定义属性名,例如:
MyView 是自定义属性组名,name 是自定义属性名
获取自定义参数
我更喜欢称attr 的引用空间为资源引用地址,这块其实很简单,基本用不着我们自己写,1.0.1 版本的 AS 工具直接就帮你写好了,但是具体的我们还是要知道的,这里可能能会出问题,明白原理我们才能处理问题
理论上 attr 的命名空间是 " http://schemas.android.com/apk/res/ " + 应用包名,比如例子中应该写成这样:
系统自带的属性后面直接跟 android
但是呢还是推荐使用 AS 工具推荐的方法,只写一个命名空间,可以包含所有的自定义属性
不推荐因为多个 view 写多个 命名空间,可能会引发混乱或是替代
有的朋友说我在 xml 里面怎么不能自动提示自定义 view 呢,其实着就像我们使用 R 文件的引用一样,我们得先 rebuild / 重启, 告知系统才行,要不系统怎么知道有什么呢
日过我们能像使用系统属性那样,使用自定义属性,那么将会是十分友好的,感官上非常 Nice,就像下面这样
上面我们可以让自定义 view 的自定义属性使用系统默认的属性,但是一旦view 设置了通用的 style 样式,那我们处理呢,也好办
获取在带样式的构造函数中获取参数
自定义View一共分为两大类,具体如下图:
对于自定义View的类型介绍及使用场景如下图:
在使用自定义View时有很多注意点(坑),希望大家要非常留意:
View的内部本身提供了post系列的方法,完全可以替代Handler的作用,使用起来更加方便、直接。
主要针对View中含有线程或动画的情况: 当View退出或不可见时,记得及时停止该View包含的线程和动画,否则会造成内存泄露问题 。
当View带有滑动嵌套情况时,必须要处理好滑动冲突,否则会严重影响View的显示效果。
接下来,我将用自定义View中最常用的 继承View 来说明自定义View的具体应用和需要注意的点
在下面的例子中,我将讲解:
下面我将逐个步骤进行说明:
步骤1:创建自定义View类(继承View类)
特别注意:
步骤2:在布局文件中添加自定义View类的组件及显示
至此,一个基本的自定义View已经实现了,运行效果如下图。
接下来继续看自定义View关于属性自定义的问题:
先来看wrap_content &match_parent属性的区别
如果不手动设置支持 wrap_content 属性,那么 wrap_content 属性是不会生效(显示效果同 match_parent )
padding 属性:用于设置控件内容相对控件边缘的边距;
如果不手动设置支持padding属性,那么padding属性在自定义View中是不会生效的。
绘制时考虑传入的padding属性值(四个方向)。
除了常见的以android:开头的系统属性(如下所示),很多场景下自定义View还需要系统所没有的属性,即自定义属性。
实现自定义属性的步骤如下:
下面我将对每个步骤进行具体介绍
对于自定义属性类型 &格式如下:
至此,一个较为规范的自定义View已经完成了。
Carson_Ho的github: 自定义View的具体应用
不定期分享关于 安卓开发 的干货,追求 短、平、快 ,但 却不缺深度 。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)