在Android中不论项目大小,都可以看到selector状态选择器的身影,一般使用在各种操作状态下,主要体现在字体,背景的切换方面,我们可以动态的使用代码去设置!也可以使用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:state_pressed(按压状态) **
selector状态选择器(bg_btn_one (存放 res - color))
使用处:
样式二:点击改变背景颜色
selector状态选择器(bg_btn_two (存放 res - drawable))
使用处:
样式三:改变背景色同时改变字体色
selector状态选择器(bg_btn_one (存放 res - color))
selector状态选择器(bg_btn_two (存放 res - drawable))
使用处:
样式四: android:state_checked (勾选状态)
selector状态选择器(bg_check_three(存放 res - drawable))
使用处:
样式五:android:state_focused (焦点状态)
selector状态选择器(bg_check_three(存放 res - color))
Selector状态选择器 - SelectorUtil:
/**
* 动态设置 点击事件 selector 的工具类 可以从本地添加 也可以从网络添加
* Created by suwenlai on 16-12-26.
*/
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(){
@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(){
@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;
}
}