Android进阶之路 - selector状态选择器

在Android中不论项目大小,都可以看到selector状态选择器的身影,一般使用在各种操作状态下,主要体现在字体,背景的切换方面,我们可以动态的使用代码去设置!也可以使用selector状态选择器去快速实现,因为它简单方便,复用性强!

Effect :
Android进阶之路 - selector状态选择器_第1张图片

俩种创建方式:

  • 以Xml方式写出状态选择器,然后将我们写好的selector状态器存在放res - drawable 或 res - color 文件夹下,较为常用
  • 在代码中动态创建selector,实现不如前者简单,但胜在灵活,一般用在选择器状态改变频繁的情况下

前期注意(请格外注意):

  • 设置 bankgrpud的时候,我们的selector状态选择器存放在res - drawable 下!!!
  • 设置TextColor属性的时候,我们的selector状态选择器存放在res - color 下!!!

状态设置类型:

  • 常用类型
//设置是否按压状态,一般在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;
    }
}

你可能感兴趣的:(#,必备初级知识点)