selector是android中常用的状态选择器,一般都用来实现组件背景的状态变换。
selector可以设置颜色状态(color-selector)和背景图状态(drawable-selector)。
也可以使用代码动态创建selector选择器。
颜色选择器样式一般放置在res/color文件夹下,一般用于背景或文字的选择样式。
图片选择器样式一般放置在res/drawable文件夹下,一般用于背景选择样式。
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item
android:color="#ffff0000" //颜色值,#RGB,$ARGB,#RRGGBB,#AARRGGBB
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_window_focused=["true" | "false"] //是否窗口聚焦
/>
<item android:state_focused="true"
android:color="#ff0000ff"/> <!-- focused -->
<item android:color="#ff000000"/> <!-- default -->
</selector>
常用的属性:
//设置是否按压状态,一般在true时设置该属性,表示已按压状态,默认为false
android:state_pressed
//设置是否选中状态,true表示已选中,false表示未选中
android:state_selected
//设置是否勾选状态,主要用于CheckBox和RadioButton,true表示已被勾选,false表示未被勾选
android:state_checked
//设置勾选是否可用状态,类似state_enabled,只是state_enabled会影响触摸或点击事件,state_checkable影响勾选事件
android:state_checkable
//设置是否获得焦点状态,true表示获得焦点,默认为false,表示未获得焦点
android:state_focused
//设置触摸或点击事件是否可用状态,一般只在false时设置该属性,表示不可用状态
android:state_enabled
不常用的属性有:
//设置当前窗口是否获得焦点状态,true表示获得焦点,false 表示未获得焦点,例如拉下通知栏或弹出对话框时, 当前界面就会失去焦点;另外,ListView的ListItem获得焦点时也会触发true状态,可以理解为当前窗口就是ListItem本身
android:state_window_focused
//设置是否被激活状态,true表示被激活,false表示未激活,API Level 11及以上才支持,可通过代码调用控件的
android:state_activated
//方法设置是否激活该控件
setActivated(boolean)
//设置是否鼠标在上面滑动的状态**,true表示鼠标在上面滑动,默认为false,API Level 14及以上才支持
//补充:selector标签下有两个比较有用的属性要说一下,添加了下面两个属性之后,则会在状态改变时出现淡入淡出效果,
//但必须在API Level 11及以上才支持
android:state_hovered
//状态改变时,旧状态消失时的淡出时间,以毫秒为单位
android:exitFadeDuration
//状态改变时,新状态展示时的淡入时间,以毫秒为单位
android:enterFadeDuration
颜色选择器:
一般用于 android:textColor="@color/btn_color"
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:color="@color/colorPrimary" android:state_pressed="true"/>
<item android:color="@color/colorAccent" />
</selector>
背景选择器:
一般用于:android:background="@drawable/bg_drawable"
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@color/colorAccent" android:state_pressed="true"/>
<item android:drawable="@color/colorPrimary" />
</selector>
两者也可以同时使用,例如在点击按钮需要改变背景的同时也需要改变字体颜色。
/**
* 动态设置 点击事件 selector 的工具类 可以从本地添加 也可以从网络添加
*/
public class SelectorUtil {
/**
* 从 drawable 获取图片 id 给 Imageview 添加 selector
* @param context 调用方法的 Activity
* @param idNormal 默认图片的 id
* @param idPress 点击图片的 id
* @param iv 点击的 view
*/
public static void addSelectorFromDrawable(Context context , int idNormal, int idPress,ImageView iv){
StateListDrawable drawable = new StateListDrawable();
Drawable normal = context.getResources().getDrawable(idNormal);
Drawable press = context.getResources().getDrawable(idPress);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
iv.setBackgroundDrawable(drawable);
}
/**
* 从 drawable 获取图片 id 给 Button 添加 selector
* @param context 调用方法的 Activity
* @param idNormal 默认图片的 id
* @param idPress 点击图片的 id
* @param button 点击的 view
*/
public static void addSelectorFromDrawable(Context context , int idNormal, int idPress,Button button){
StateListDrawable drawable = new StateListDrawable();
Drawable normal = context.getResources().getDrawable(idNormal);
Drawable press = context.getResources().getDrawable(idPress);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
button.setBackgroundDrawable(drawable);
}
/**
* 从网络获取图片 给 ImageView 设置 selector
* @param clazz 调用方法的类
* @param normalUrl 获取默认图片的链接
* @param pressUrl 获取点击图片的链接
* @param imageView 点击的 view
*/
public static void addSeletorFromNet(final Class clazz, final String normalUrl, final String pressUrl, final ImageView imageView){
new AsyncTask<Void,Void,Drawable>(){
@Override
protected Drawable doInBackground(Void... params) {
StateListDrawable drawable = new StateListDrawable();
Drawable normal = loadImageFromNet(clazz,normalUrl);
Drawable press = loadImageFromNet(clazz, pressUrl);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
return drawable;
}
@Override
protected void onPostExecute(Drawable drawable) {
super.onPostExecute(drawable);
imageView.setBackgroundDrawable(drawable);
}
}.execute();
}
/**
*
* 从网络获取图片 给 Button 设置 selector
* @param clazz 调用方法的类
* @param normalUrl 获取默认图片的链接
* @param pressUrl 获取点击图片的链接
* @param button 点击的 view
*/
public static void addSeletorFromNet(final Class clazz, final String normalUrl, final String pressUrl, final Button button){
new AsyncTask<Void,Void,Drawable>(){
@Override
protected Drawable doInBackground(Void... params) {
StateListDrawable drawable = new StateListDrawable();
Drawable normal = loadImageFromNet(clazz,normalUrl);
Drawable press = loadImageFromNet(clazz, pressUrl);
drawable.addState(new int[]{android.R.attr.state_pressed},press);
drawable.addState(new int[]{-android.R.attr.state_pressed},normal);
return drawable;
}
@Override
protected void onPostExecute(Drawable drawable) {
super.onPostExecute(drawable);
button.setBackgroundDrawable(drawable);
}
}.execute();
}
/**
* 从网络获取图片
* @param clazz 调用方法的类
* @param netUrl 获取图片的链接
* @return 返回一个 drawable 类型的图片
*/
private static Drawable loadImageFromNet(Class clazz, String netUrl) {
Drawable drawable =null;
try {
drawable = Drawable.createFromStream(new URL(netUrl).openStream(), "netUrl.jpg");
} catch (IOException e) {
MyLog.e(clazz.getName(),e.getMessage());
}
return drawable;
}
}
selector 也可以结合shape进行使用。对于shape的使用,这里也进行过整理:
Android形状属性Shape的使用(一)
Android形状属性Shape的使用(二)
bg_bt_drawable_normal.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="10dp" />
<stroke
android:width="2dp"
android:color="@color/black" />
</shape>
bg_bt_drawable_pressed.xml:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="5dp" />
<stroke
android:width="2dp"
android:color="@color/blue"
android:dashGap="10dp" />
<gradient
android:centerColor="@color/red"
android:endColor="@color/green" />
</shape>
bg_bt_selector.xml:
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/bg_bt_drawable_pressed" android:state_pressed="true" />
<item android:drawable="@drawable/bg_bt_drawable_normal" />
</selector>
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_pressed="true" >
<shape >
<corners android:radius="5dp" />
<stroke
android:width="2dp"
android:color="@color/blue"
android:dashGap="10dp" />
<gradient
android:centerColor="@color/red"
android:endColor="@color/green" />
</shape>
</item>
<item>
<shape>
<corners android:radius="10dp" />
<stroke
android:width="2dp"
android:color="@color/black" />
</shape>
</item>
</selector>