1、相关链接
- 资源文件详解,系列文章:https://keeganlee.me/post/android/20150830(看这篇就够了)
- google官方资源文件文档:https://developer.android.com/guide/topics/resources/drawable-resource#Shape
2、drawable示例
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!--直接指定drawable的情况,内部不需要自定义shape-->
<item android:drawable="@color/color_weak_2" android:state_pressed="false"></item>
<!--自定义shape的情况-->
<item android:state_focused="true">
<!--矩形的shape-->
<shape android:shape="rectangle">
<!--圆角-->
<corners android:radius="5dp" />
<!--填充颜色为白色-->
<solid android:color="@color/color_weak_1" />
<!--描边-->
<stroke android:width="1dp" android:color="@color/color_weak_2" />
</shape>
</item>
<item android:drawable="@color/color_weak_2" android:state_selected="false">
<!--圆形的shape-->
<shape android:shape="oval">
<!--填充颜色为白色-->
<solid android:color="@color/color_weak_1" />
<!--描边-->
<stroke android:width="1dp" android:color="@color/color_weak_2" />
</shape>
</item>
<item android:drawable="@color/color_weak_2" android:state_checkable="false">
<!--渐变的填充方式-->
<shape android:shape="rectangle">
<gradient android:angle="90" android:centerColor="#30666666" android:endColor="#80666666" android:startColor="#00666666" />
</shape>
</item>
<!--default的选择器-->
<item android:drawable="@color/color_weak_2"></item>
</selector>
3、 Selector
3.1 作用
根据控件不同的状态匹配相应的drawable进行显示
3.2 包含的子元素
3.2.1 <item>
(1)作用:根据View不同的状态选择对应的drawable
(2)属性
- drawable:参见demo
- 可不设置
- 可通过自定义shape实现
- 状态
- 参见3.3
3.3 匹配机制
-
读取当前按钮的状态
-
根据我们定义的规则,从上往下匹配(注意定义的顺序非常重要)
-
匹配的第一项作为当前View使用的drawable
匹配顺序排放最佳实践:
1、因为匹配的第一项作为当前View展示的drawable。如果第一项每次都能被匹配到,就不会往下匹配,那么之后的状态也就失效了。然而每一个View对象都有默认状态(不设置任何state),所以这也就是为什么默认状态不能放在开头,而要放到最后的原因。
2、不是所有的View子类都拥有八种状态,比如Button对象,拥有pressed、enabled、window_focused、default四种状态。如果为其设置selected是无效的,所以要根据组件的具体情况设置。
3、状态的顺序排放。(最佳实践)
pressed->focused->selected->checkable->checked->enabled->window_focused->default(不设任何状态)
具体排放顺序还得根据当前View对象拥有的状态来排列。
4、Shape
4.1 作用
通过shape绘制不同的形状,如矩形,圆形,直线等
- shape详解:https://keeganlee.me/post/android/20150830 (shape看这篇文章就够了)
4.2 属性
(1)android:shape
- rectangle: 矩形,默认的形状,可以画出直角矩形、圆角矩形、弧形等
- oval: 椭圆形,用得比较多的是画正圆
- line: 线形,可以画实线和虚线
- ring: 环形,可以画环形进度条
4.3 包含的元素
(1)solid: 设置形状填充的颜色,只有android:color一个属性
- android:color 填充的颜色
(2)padding: 设置内容与形状边界的内间距,可分别设置左右上下的距离
- android:left 左内间距
- android:right 右内间距
- android:top 上内间距
- android:bottom 下内间距
(3)gradient: 设置形状的渐变颜色,可以是线性渐变、辐射渐变、扫描性渐变
- android:type 渐变的类型
- linear 线性渐变,默认的渐变类型
- radial 放射渐变,设置该项时,android:gradientRadius也必须设置
- sweep 扫描性渐变
- android:startColor 渐变开始的颜色
- android:endColor 渐变结束的颜色
- android:centerColor 渐变中间的颜色
- android:angle 渐变的角度,线性渐变时才有效,必须是45的倍数,0表示从左到右,90表示从下到上
- android:centerX 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
- android:centerY 渐变中心的相对X坐标,放射渐变时才有效,在0.0到1.0之间,默认为0.5,表示在正中间
- android:gradientRadius 渐变的半径,只有渐变类型为radial时才使用
- android:useLevel 如果为true,则可在LevelListDrawable中使用
(4)corners: 设置圆角,只适用于rectangle类型,可分别设置四个角不同半径的圆角,当设置的圆角半径很大时,比如200dp,就可变成弧形边了
- android:radius 圆角半径,会被下面每个特定的圆角属性重写
- android:topLeftRadius 左上角的半径
- android:topRightRadius 右上角的半径
- android:bottomLeftRadius 左下角的半径
- android:bottomRightRadius 右下角的半径
(5)stroke: 设置描边,可描成实线或虚线。
- android:color 描边的颜色
- android:width 描边的宽度
- android:dashWidth 设置虚线时的横线长度
- android:dashGap 设置虚线时的横线之间的距离
4.4 最佳实践