# 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

自定义属性步骤:

  1. 声明属性

resvalues 目录下的 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:位或运算
  1. 布局文件中使用

首先需要加上一个命名空间 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

Edited on Views times