Selector & Shape
res/drawable or res/color 目录下
Selector
用于改变样式,比如按钮默认是白色的,获得焦点时变蓝色,按下时变黑色
<?xml version="1.0" encoding="utf-8" ?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 默认时的背景图片-->
<item android:drawable="@drawable/pic1" />
<!-- 获得焦点时的背景图片 :: 换颜色 -->
<item android:state_focused="true" android:drawable="@drawable/pic2" />
<!-- 单击时的背景图片 :: 通过Shape换颜色 -->
<item android:state_pressed="true" ><shape><solid android:color="#E8B714"/></shape></item>
<!-- 选中时的图片背景 :: 通过资源的Shape换样式 -->
<item android:state_selected="true" android:drawable="@drawable/myshape" />
<!-- 启用且获得焦点时的图片背景 -->
<item android:state_enabled=“true” android:state_focused="true" android:drawable="@drawable/pic5" />
</selector>
Selector属性
属性=”true”/”false” | 功能 |
---|---|
android:constantSize | drawable的大小是否当中状态变化,true表示是变化,false表示不变换,默认为false |
android:dither | 当位图与屏幕的像素配置不一样时(例如,一个ARGB为8888的位图与RGB为555的屏幕)会自行递色(dither)。设置为false时不可递色。默认true |
android:variablePadding | 内边距是否变化,默认false |
item if
属性=”true”/”false” | 功能 |
---|---|
android:state_pressed | 是否触摸/单击 |
android:state_focused | 是否获得焦点 |
android:state_selected | 是否被状态 |
android:state_checkable | 是否可选 |
android:state_checked | 是否选中 |
android:state_enabled | 是否启用/响应事件 |
android:state_activated | 是否激活 |
android:state_window_focused | 应用程序是否在前台,当通知栏被拉下或者对话框弹出时应用程序就不在前台 |
item then
属性 | 功能 |
---|---|
android:drawable=”@drawable/pic” | 切换图片资源 |
android:color=”#FFFFFF” | 切换颜色 |
再解析
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android"
android:constantSize=["true" | "false"]//drawable的大小是否当中状态变化,true表示是变化,false表示不变换,默认为false
android:dither=["true" | "false"]//当位图与屏幕的像素配置不一样时(例如,一个ARGB为8888的位图与RGB为555的屏幕)会自行递色(dither)。设置为false时不可递色。默认true
android:variablePadding=["true" | "false"]//内边距是否变化,默认false >
<item 一个个选项(获得焦点时/按住时/...)
//如果
android:state_pressed=["true"/"false"] //是否被触摸/单击
android:state_focused=["true"/"false"] //是否获得焦点
android:state_selected=["true"/"false"] //是否被状态
android:state_checkable=["true"/"false"] //是否可选
android:state_checked=["true"/"false"] //是否选中
android:state_enabled=["true"/"false"] //是否启用/响应事件
android:state_activated=["true"/"false"] //是否激活
android:state_window_focused=["true"/"false"] //应用程序是否在前台,当通知栏被拉下或者对话框弹出时应用程序就不在前台
//那么
android:drawable="@drawable/pic" //切换图片资源
/>
<item 2 />
...
</selector>
引用::
android:listSelector="@drawable/selector_my"
android:background="@drawable/selector_my"
android:textColor="@color/selector_my"
View.setSelector( getResources().getDrawable(R.drawable.myselector) );
为了防止列表拉黑的情况发生,需要在ListView中添加以下的属性代码
android:cacheColorHint="@android:color/transparent"
shape
shape用于设定形状,可以在selector,layout等里面使用,有6个子标签,各属性如下:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="oval" > <!-- shape的形状: rectangle:长方形, oval:椭圆, line:线条, ring:圆环 -->
<!-- android:innerRadius: 内环的半径
android:innerRadiusRatio: 内环的比例 (例: =2, 那么内环的半径就为环半径除以2, 如果设置了innerRadius则不起作用)
android:thickness: 环的厚度
android:thicknessRatio: 环的厚度比例 (例: =2, 那么环的厚度就为环半径除以2; 如果设置了thickness则不起作用)
android:useLevel: 只有当shape使用在LevelListDrawable中的时候, 这个值为true, 否则为false -->
<!-- 实心 -->
<solid android:color="#FFDEAD"/><!-- 填充的颜色 -->
<!-- 大小 -->
<size android:width="50dp" android:height="50dp"/><!-- 宽度, 高度 -->
<!-- 间隔 -->
<padding
android:left="20dp"
android:top="20dp"
android:right="20dp"
android:bottom="20dp"/>
<!-- 各方向的间隔 内边距 同XML的android:padding -->
<!-- 圆角 -->
<corners android:radius="9dp" />
<!-- android:radius="9dp" 设置四个角的半径 (单独设定的圆角半径会覆盖radius)
android:topLeftRadius="2dp" 设置左上角的半径
android:topRightRadius="2dp" 设置右上角的半径
android:bottomLeftRadius="2dp" 设置右下角的半径
android:bottomRightRadius="2dp" 设置左下角的半径 -->
<!-- 渐变 -->
<gradient
android:startColor="#FFFFFF"
android:endColor="#FF0000"
android:type="radial"
android:gradientRadius="80"/>
<!-- 设置填充颜色后,渐变无效
android:startColor="#FFFFFF" 起始颜色
android:centerColor="#000000" 过渡颜色
android:endColor="#FF0000" 结束颜色
android:angle="45" 渐变角度 (必须是45的倍数)
android:type="radial" 渐变类型: linear:线性变化, radial:辐射渐变, sweep:扫描渐变
android:centerX="0"
android:centerY="0"
android:gradientRadius="90" 辐射半径, 类型=radial时需要设置 -->
<!-- 描边 -->
<stroke
android:width="2dp"
android:color="@android:color/black"
android:dashWidth="1dp"
android:dashGap="2dp"/>
<!-- android:width=”20dp” 边边的宽度
android:color=”@android:color/black” 边边的颜色
android:dashWidth=”2dp” 虚线的宽度
android:dashGap=”20dp” 虚线的间隔宽度 -->
</shape>