观心静

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

前言

  StateListDrawable是与xml中的selector属性对应代码实现类,它需要配合GradientDrawable的使用,如果你还不了解GradientDrawable可以参考我的另一篇博客:https://www.cnblogs.com/guanxinjing/p/11142599.html

属性

 

<!--    当视图具有输入焦点时设置-->
<attr name="state_focused" format="boolean" />

<!--    当视图的窗口具有输入焦点时设置-->
<attr name="state_window_focused" format="boolean" />

<!--    在启用视图时设置.-->
<attr name="state_enabled" format="boolean" />

<!--    被复选选中时设置-->
<attr name="state_checkable" format="boolean"/>

<!--    被单选选中时设置-->
<attr name="state_checked" format="boolean"/>

<!--    被选中时设置-->
<attr name="state_selected" format="boolean" />

<!--    当用户在视图中按下时设置-->
<attr name="state_pressed" format="boolean" />

<!--    当视图或其父视图已“激活”时设置,这意味着用户当前已将其标记为感兴趣。
这是 state_checked 的另一种表示形式,用于将状态向下传播到视图层次结构。-->
<attr name="state_activated" format="boolean" />

<!--    当视图或可绘制对象被其宿主视为“活动”时设置。实际使用情况可能因视图而异-->
<attr name="state_active" format="boolean" />

<!--    当视图或可绘制对象被其宿主视为“单个”时设置。实际使用情况可能因视图而异。-->
<attr name="state_single" format="boolean" />

<!--    当视图或可绘制对象位于有序集中的第一个位置时设置。实际使用情况可能因视图而异-->
<attr name="state_first" format="boolean" />

<!--    当视图或可绘制对象位于有序集中的中间位置时设置。实际使用情况可能因视图而异-->
<attr name="state_middle" format="boolean" />

<!--    当视图或可绘制对象位于有序集中的最后位置时设置。实际使用情况可能因视图而异-->
<attr name="state_last" format="boolean" />

<!--    表示 Drawable 处于硬件加速的视图中。这意味着该设备至少可以以 60fps 的速度渲染一个全屏缩放位图,
其中包含一层文本和合成位图。设置后,即使 colorBackgroundCacheHint 指定了纯色,它也会被忽略,因为不需要优化。-->
<attr name="state_accelerated" format="boolean" />

<!--    当指针悬停在视图上时设置-->
<attr name="state_hovered" format="boolean" />

<!--    指示 Drawable 位于能够接受拖放操作中当前正在操作的内容的放置的视图中-->
<attr name="state_drag_can_accept" format="boolean" />

<!--    指示拖动操作(Drawable 的视图是有效接收者)当前位于 Drawable-->
<attr name="state_drag_hovered" format="boolean" />

<!--    表示视图具有可访问性焦点-->
<attr name="state_accessibility_focused" format="boolean" />

 

 

ripple涟漪的配合使用

 

 

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true">
        <ripple android:color="@color/white" android:radius="1000dp">
            <item android:drawable="@mipmap/launcher_ic_news" />
        </ripple>
    </item>
    <item android:state_focused="true" android:drawable="@mipmap/launcher_ic_news"/>
    <item android:drawable="@mipmap/launcher_ic_news" android:state_selected="true" />
    <item android:drawable="@mipmap/launcher_ic_news"/>

</selector>

 

代码上实现StateListDrawable点击效果

        GradientDrawable drawableRed = new GradientDrawable();
        drawableRed.setShape(GradientDrawable.RECTANGLE);
        drawableRed.setColor(Color.RED);

        GradientDrawable drawableBlue = new GradientDrawable();
        drawableBlue.setShape(GradientDrawable.RECTANGLE);
        drawableBlue.setColor(Color.BLUE);

        int pressed =  android.R.attr.state_pressed;
        StateListDrawable stateListDrawable = new StateListDrawable();
        stateListDrawable.addState(new int[]{pressed}, drawableRed);
        stateListDrawable.addState(new int[]{-pressed}, drawableBlue);
        btn1.setBackground(stateListDrawable);

 

效果图:

 

posted on 2019-07-25 14:08  观心静  阅读(3700)  评论(0编辑  收藏  举报