休闲老徐 發表於 2019-7-25 14:08:00

Android开发 StateListDrawable(selector)详解

<h1><span style="color: rgba(0, 128, 128, 1)">前言</span></h1>
<p>  StateListDrawable是与xml中的<span style="color: rgba(0, 0, 0, 1); background-color: rgba(255, 255, 255, 1)">selector属性对应代码实现类,它需要配合</span><span style="background-color: rgba(255, 255, 255, 1)">GradientDrawable的使用,如果你还不了解GradientDrawable可以参考我的另一篇博客:https://www.cnblogs.com/guanxinjing/p/11142599.html</span></p>
<h1><span style="background-color: rgba(255, 255, 255, 1); color: rgba(0, 128, 128, 1)">属性</span></h1>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图具有输入焦点时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_focused"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图的窗口具有输入焦点时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_window_focused"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    在启用视图时设置.</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_enabled"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    被复选选中时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_checkable"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    被单选选中时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_checked"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    被选中时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_selected"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当用户在视图中按下时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_pressed"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

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

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图或可绘制对象被其宿主视为“活动”时设置。实际使用情况可能因视图而异</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_active"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图或可绘制对象被其宿主视为“单个”时设置。实际使用情况可能因视图而异。</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_single"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图或可绘制对象位于有序集中的第一个位置时设置。实际使用情况可能因视图而异</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_first"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图或可绘制对象位于有序集中的中间位置时设置。实际使用情况可能因视图而异</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_middle"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当视图或可绘制对象位于有序集中的最后位置时设置。实际使用情况可能因视图而异</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_last"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

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

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    当指针悬停在视图上时设置</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_hovered"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    指示 Drawable 位于能够接受拖放操作中当前正在操作的内容的放置的视图中</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_drag_can_accept"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    指示拖动操作(Drawable 的视图是有效接收者)当前位于 Drawable</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_drag_hovered"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 128, 0, 1)">&lt;!--</span><span style="color: rgba(0, 128, 0, 1)">    表示视图具有可访问性焦点</span><span style="color: rgba(0, 128, 0, 1)">--&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">attr </span><span style="color: rgba(255, 0, 0, 1)">name</span><span style="color: rgba(0, 0, 255, 1)">="state_accessibility_focused"</span><span style="color: rgba(255, 0, 0, 1)"> format</span><span style="color: rgba(0, 0, 255, 1)">="boolean"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span></pre>
</div>
<p>&nbsp;</p>
<p>&nbsp;</p>
<h1><span style="color: rgba(0, 128, 128, 1)"><span style="background-color: rgba(255, 255, 255, 1)">与</span>ripple涟漪的配合使用</span></h1>
<p>&nbsp;</p>
<p>&nbsp;</p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">&lt;?</span><span style="color: rgba(255, 0, 255, 1)">xml version="1.0" encoding="utf-8"</span><span style="color: rgba(0, 0, 255, 1)">?&gt;</span>
<span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">selector </span><span style="color: rgba(255, 0, 0, 1)">xmlns:android</span><span style="color: rgba(0, 0, 255, 1)">="http://schemas.android.com/apk/res/android"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">android:state_pressed</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">ripple </span><span style="color: rgba(255, 0, 0, 1)">android:color</span><span style="color: rgba(0, 0, 255, 1)">="@color/white"</span><span style="color: rgba(255, 0, 0, 1)"> android:radius</span><span style="color: rgba(0, 0, 255, 1)">="1000dp"</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
            <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">android:drawable</span><span style="color: rgba(0, 0, 255, 1)">="@mipmap/launcher_ic_news"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
      <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">ripple</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">item</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">android:state_focused</span><span style="color: rgba(0, 0, 255, 1)">="true"</span><span style="color: rgba(255, 0, 0, 1)"> android:drawable</span><span style="color: rgba(0, 0, 255, 1)">="@mipmap/launcher_ic_news"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">android:drawable</span><span style="color: rgba(0, 0, 255, 1)">="@mipmap/launcher_ic_news"</span><span style="color: rgba(255, 0, 0, 1)"> android:state_selected</span><span style="color: rgba(0, 0, 255, 1)">="true"</span> <span style="color: rgba(0, 0, 255, 1)">/&gt;</span>
    <span style="color: rgba(0, 0, 255, 1)">&lt;</span><span style="color: rgba(128, 0, 0, 1)">item </span><span style="color: rgba(255, 0, 0, 1)">android:drawable</span><span style="color: rgba(0, 0, 255, 1)">="@mipmap/launcher_ic_news"</span><span style="color: rgba(0, 0, 255, 1)">/&gt;</span>

<span style="color: rgba(0, 0, 255, 1)">&lt;/</span><span style="color: rgba(128, 0, 0, 1)">selector</span><span style="color: rgba(0, 0, 255, 1)">&gt;</span></pre>
</div>
<p>&nbsp;</p>
<h1><span style="background-color: rgba(255, 255, 255, 1); color: rgba(0, 128, 128, 1)">代码上实现StateListDrawable点击效果</span></h1>
<div class="cnblogs_code">
<pre>      GradientDrawable drawableRed = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> GradientDrawable();
      drawableRed.setShape(GradientDrawable.RECTANGLE);
      drawableRed.setColor(Color.RED);

      GradientDrawable drawableBlue </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> GradientDrawable();
      drawableBlue.setShape(GradientDrawable.RECTANGLE);
      drawableBlue.setColor(Color.BLUE);

      </span><span style="color: rgba(0, 0, 255, 1)">int</span> pressed =<span style="color: rgba(0, 0, 0, 1)">android.R.attr.state_pressed;
      StateListDrawable stateListDrawable </span>= <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> StateListDrawable();
      stateListDrawable.addState(</span><span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)">[]{pressed}, drawableRed);
      stateListDrawable.addState(</span><span style="color: rgba(0, 0, 255, 1)">new</span> <span style="color: rgba(0, 0, 255, 1)">int</span>[]{-<span style="color: rgba(0, 0, 0, 1)">pressed}, drawableBlue);
      btn1.setBackground(stateListDrawable);</span></pre>
</div>
<p>&nbsp;</p>
<p>效果图:</p>
<p><img src="https://img2018.cnblogs.com/blog/1497956/201907/1497956-20190725140605575-1358115020.gif" alt=""></p>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div style="text-align: center">
    <p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/11243902.html </p>
    <div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/11243902.html
頁: [1]
查看完整版本: Android开发 StateListDrawable(selector)详解