博客
关于我
selector
阅读量:219 次
发布时间:2019-02-28

本文共 2454 字,大约阅读时间需要 8 分钟。

Android状态选择器详解

1. 状态选择器的作用

状态选择器(StateListDrawable)是Android系统中一个强大的工具,用于为UI组件根据不同的状态定义不同的视觉效果。通过状态选择器,可以为View在不同状态下设置不同的背景图像或颜色,从而提升用户体验。

2. 常见状态定义

Android定义了多种状态,可以让View根据状态切换不同的外观。以下是常见的状态定义:

  • android:drawable:为View设置默认的背景图像或颜色。
  • android:state_pressed:表示View被按下(如按钮)。
  • android:state_focused:表示View获得焦点(如文本框)。
  • android:state_window_focused:表示应用程序是否在前台。
  • android:state_selected:表示View被选中(如ListView中的项)。
  • android:state_checkable:表示View是否可以被选中。
  • android:state_checked:表示View已经被选中(如RadioButton)。
  • android:state_enabled:表示View是否能接收触摸或点击事件。

3. Focused与Selected的区别

  • Focused状态:通常由按键操作引起,一个窗口只能有一个View获得焦点。
  • Selected状态:由应用程序主动调用setSelected()控制,可以有多个View处于selected状态。

4. 常用组件的状态设置

4.1 Checkbox设置

4.2 ImageButton设置

4.3 Button设置

4.4 TextView设置

5. StateListDrawable类功能

5.1 类结构

public class StateListDrawable extends DrawableContainer {    // DrawableContainer是Drawable的子类,用于管理多个Drawable对象}public class DrawableContainer extends Drawable implements Callback {    // Callback接口用于定义Drawable的回调方法}

5.2 常用方法

  • addState方法:用于为特定的状态集合设置Drawable图片资源。

    stalistDrawable.addState(new int[]{pressed, window_focused}, getResources().getDrawable(R.drawable.guide_1));
  • drawableStateChanged方法:根据当前View的状态属性值更新Drawable对象。

  • getState方法:获取当前View的状态属性值并返回状态集合。

  • setState方法:根据提供的状态集合更新Drawable对象,并触发状态变化回调。

6. 状态切换的实现

状态切换主要通过以下步骤实现:

  • 获取当前状态集合:调用getDrawableState()方法获取当前View的状态属性值。
  • 更新Drawable对象:调用setState()方法,根据新的状态集合找到匹配的Drawable对象。
  • 刷新View:调用invalidateSelf()方法刷新View的外观。
  • 7. 动态创建StateListDrawable

    除了使用XML文件,开发者还可以通过程序matic方式创建StateListDrawable对象:

    StateListDrawable stalistDrawable = new StateListDrawable();stalistDrawable.addState(new int[]{pressed, window_focused}, getResources().getDrawable(R.drawable.guide_1));// 其他添加状态的操作...Drawable mBackground = stalistDrawable;mBackground.setCallback(this); // 设置回调this.setBackgroundDrawable(null); // 去掉默认背景

    8. TextView颜色设置

    8.1 通过方法设置

    tv.setTextColor(Color.parseColor("#FFFFFF")); // 通过argb值设置tv.setTextColor(Color.rgb(255, 255, 255)); // 通过颜色分量设置tv.setTextColor(getResources().getColor(R.color.my_color)); // 通过资源引用设置

    8.2 通过ColorStateList设置

    Resources resource = getBaseContext().getResources();ColorStateList csl = (ColorStateList) resource.getColorStateList(R.color.my_color);if (csl != null) {    tv.setTextColor(csl);}

    8.3 通过XML文件设置

    #FFFFFF

    通过上述方法,开发者可以根据需求灵活设置TextView的颜色。

    转载地址:http://yyss.baihongyu.com/

    你可能感兴趣的文章
    python--003--百分号字符串拼接、format
    查看>>
    Python--10、线程
    查看>>
    Python--Redis实战:第四章:数据安全与性能保障:第4节:复制
    查看>>
    python--基本代码规范
    查看>>
    Python--抽象类接口类
    查看>>
    PYTHON--欧拉习题二
    查看>>
    python--高级应用总结
    查看>>
    python-520表白代码,我看谁说程序员不懂浪漫,送你几套表白代码,一步到位
    查看>>
    Python-Asyncio TypeError:无法在‘;等待‘;表达式中使用对象DICT
    查看>>
    Python-AttributeError:‘;dict&39;对象没有属性‘;序列‘;
    查看>>
    Python-ldap:是否可以在不显式写入密码的情况下进行绑定?
    查看>>
    python出现 unknown encoding: idna 的处理方法
    查看>>
    Python出现 RuntimeError: dictionary changed size during iteration 的解决方法
    查看>>
    Python-numpy(2)数组的操作
    查看>>
    Python-Numpy的tile函数用法
    查看>>
    python-open函数
    查看>>
    Python-Pandas-将特定函数应用于给定级别-多索引数据框架
    查看>>
    python-queue队列通信
    查看>>
    python-ros No module named PyKDL
    查看>>
    python-social-auth 是否需要会话
    查看>>