为何自定义控件要步骤化呢?由于不少新手同窗,根据产品的要求作一些控件时,无从下手。android
有了步骤之后,就能够按套路走了,不再用惧怕了。markdown
首先咱们要判断这个控件是属于自定义控件里的哪一种类型,若是不知道分类的话,同窗们能够看这篇文章自定义控件分类
app
其实这玩意在自定义控件里叫自定义属性。什么是属性呢?布局
来咱们看,android控件原有的属性:spa
好比说咱们的LinearLayoutcode
<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都有的orm
那么咱们在写本身的控件时,有些值,也是经过xml里的属性进行配置的,因此咱们要有自定义属性。xml
自定义控件里如何自定义属性呢?utf-8
自定义属性步骤:资源
在res
的values
目录下的attrs.xml
文件中(没有就本身新建一个),使用declare-styleable
标签自定义属性。
在attrs.xml里进行声明,其实都行,都是resourse,举例:
<?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"
而后直接利用这个命名空间设置属性便可
<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则须要测量本身(设置本身大小)
这两个参数要理解