# Android 自定控件的步骤
为什么自定义控件要步骤化呢?因为很多新手同学,根据产品的要求做一些控件时,无从下手。
有了步骤以后,就可以按套路走了,再也不用害怕了。
![img]()
# 判断控件类型
首先我们要判断这个控件是属于自定义控件里的哪种类型,如果不知道分类的话,同学们可以看这篇文章 自定义控件分类
# 获取相关的属性
其实这玩意在自定义控件里叫自定义属性。什么是属性呢?
来我们看,android 控件原有的属性:
比如说我们的 LinearLayout
1 2 3 4 5 6 7 8
| <LinearLayout android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_centerHorizontal="true" android:layout_marginBottom="41px" android:orientation="horizontal"> </LinearLayout>
|
这里面的属性就有 origintation,layout_width,layout_height… 而 origintation 是 LinearLayout 特有的,而其他的则是 View 都有的
那么我们在写自己的控件时,有些值,也是通过 xml 里的属性进行配置的,所以我们要有自定义属性。
自定义控件里如何自定义属性呢?
![img]()
![img]()
自定义属性步骤:
- 声明属性
在 res
的 values
目录下的 attrs.xml
文件中 (没有就自己新建一个),使用 declare-styleable
标签自定义属性。
在 attrs.xml 里进行声明,其实都行,都是 resourse,举例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30
| <?xml version="1.0" encoding="utf-8"?> <resources> <!--属性集合--> <declare-styleable name="SearchView" > <!--hint--> <attr name="hint" format="string"/> <!--搜索图标 可以通过typedArray.getResourceId获取资源id--> <attr name="search_ico" format="reference" /> <!--清空图标--> <attr name="clear_ico" format="reference" /> <!--语音图标--> <attr name="voice_ico" format="reference" /> <!--输入类型--> <attr name="input_type"> <!--value值只能是int类型的 所以获取时通过typeArray.getInt获取--> <enum name="text" value="0"/> <enum name="passwordText" value="1"/> </attr>
<attr name="gravity"> <!--区别于enum enum只能选择一个 flag可以多选 如:left|top--> <flag name="left" value="0" /> <flag name="top" value="1" /> <flag name="center" value="2" /> <flag name="right" value="3" /> <flag name="bottom" value="4" /> </attr> </declare-styleable>
</resources>
|
其中 declare-styleable
标签代表一个属性集合, name
属性要与自定义的控件同名。 attr
则是每条属性了, name
是属性值, format
是指定属性类型,目前可支持 11 种类型:
- reference: 引用资源
- string: 字符串
- Color:颜色
- boolean:布尔值
- dimension:尺寸值
- float:浮点型
- integer:整型
- fraction:百分数
- enum:枚举类型
- flag:位或运算
- 布局文件中使用
首先需要加上一个命名空间 xmlns:app="http://schemas.android.com/apk/res-auto"
然后直接利用这个命名空间设置属性即可
1 2 3 4 5 6 7 8 9 10 11 12
| <com.searchview.SearchView android:id="@+id/searchView" android:layout_width="match_parent" android:layout_height="50dp" android:layout_marginEnd="8dp" android:layout_marginStart="8dp" android:layout_marginTop="8dp" app:hint="aaa" app:search_ico="@drawable/ic_search" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent" />
|
# 测量
测量是重点要掌握的,如果是 ViewGroup 则测量自己 (设置自己大小,因为 ViewGroup 也可以是子 view 呀) 跟设置期望孩子的大小。
如果是 View 则需要测量自己(设置自己大小)
![img]()
这两个参数要理解
![img]()
![img]()
# 自定义控件的本质
![img]()