【问题标题】:How to set state_selected in ripple drawable如何在波纹可绘制中设置 state_selected
【发布时间】:2015-02-14 07:24:39
【问题描述】:

如何在RippleDrawable 中指定android:state_selected

我有以下用于可绘制波纹的 xml,但是当我设置 myView.setSelected(true); 时背景颜色不显示

<?xml version="1.0" encoding="utf-8"?>
<ripple
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="#DDDDDD"
    >

    <item android:id="@android:id/mask">
        <shape>
            <solid
                android:color="@color/black" />
        </shape>
    </item>


    <item android:state_selected="true">
        <shape>
            <solid
                android:color="#EEEEEE" />
        </shape>
    </item>


    <item>
        <color android:color="#FFFFFF" />
    </item>

</ripple>

【问题讨论】:

    标签: android android-5.0-lollipop rippledrawable


    【解决方案1】:

    找到答案,以防万一其他人遇到同样的问题

    <?xml version="1.0" encoding="utf-8"?>
    <ripple
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="#DDDDDD"
        >
    
    
        <item>
            <selector>
                <item android:state_selected="true">
                    <color android:color="#EEEEEE" />
                </item>
    
                <item android:state_activated="true">
                    <color android:color="#EEEEEE" />
                </item>
    
                <item>
                    <color android:color="#FFFFFF" />
                </item>
            </selector>
        </item>
    
    
    </ripple>
    

    【讨论】:

    • 您不需要在此处设置蒙版层,因为您的蒙版和内容具有相同的边界和不透明度。移除遮罩将大大提高性能。
    • 谢谢@alanv。取下了面具。您提到了相同的边界和不透明度,不透明度在蒙版中是如何工作的?
    • 由于某种原因,如果您对选择器正常状态使用透明颜色,那么您应该使用蒙版,否则不会绘制波纹。
    • @vovahost 嗨,关于透明颜色问题,您是对的,但即使使用蒙版,也会出现波纹,但颜色不是 100% 不透明,它具有一定的透明度。你知道如何处理吗?
    【解决方案2】:

    添加到@Sohaib 的答案:

    @Alanv 说得对,OP 不需要面具。但是,如果您的选择器状态之一是透明的并且您需要一个掩码,则它会出现在此处:

    <?xml version="1.0" encoding="utf-8"?>
    <ripple
        xmlns:android="http://schemas.android.com/apk/res/android"
        android:color="@color/ripple_color">
    
        <!-- mask here... -->
        <item android:id="@android:id/mask">
            <color android:color="@color/black"/> <!-- any color will do -->
        </item>
    
        <item>
            <selector>
                <!-- ... NOT here. -->
                <item android:state_selected="true">
                    <color android:color="@color/blue"/>
                </item>
    
                <item android:state_activated="true">
                    <color android:color="@color/red"/>
                </item>
    
                <item>
                    <color android:color="@color/transparent"/>
                </item>
            </selector>
        </item>
    </ripple>
    

    我最初在选择器和 :boom: 中有掩码:

    【讨论】:

      【解决方案3】:

      将上述答案与其他答案相结合:

      What should be the color of the Ripple, colorPrimary or colorAccent? (Material Design)

      产生很好的涟漪效果,当项目处于选定状态时也适用。

      <ripple xmlns:android="http://schemas.android.com/apk/res/android"
          android:color="?attr/colorControlHighlight">
      <!-- Ripple mask - applied to all selector states -->
      <item android:id="@android:id/mask">
          <color android:color="#42ffffff" />
      </item>
      <!-- Selected state of item -->
      <item>
          <selector>
              <item android:state_selected="true">
                  <color android:color="?attr/colorAccent" />
              </item>
          </selector>
      </item>
      </ripple>
      

      这在您的 drawable-v21 文件夹中,对于其他平台,您可以创建一个使用强调色的选择器:

      <selector xmlns:android="http://schemas.android.com/apk/res/android">
          <item android:drawable="@color/accent" android:state_selected="true"/>
          <item android:drawable="@color/accent" android:state_pressed="true"/>
      </selector>
      

      【讨论】:

        【解决方案4】:

        我想模仿 Material Design 复选框的行为,但在使用这样的 ColorStateList 之前我无法正确使用它们:

        在drawable-v21/bg_checkbox_ripple.xml中

        <?xml version="1.0" encoding="utf-8"?>
        <ripple
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:color="@color/checked_accent_statelist"
            android:radius="24dp">
        </ripple>
        

        在 color/checked_accent_statelist.xml 中

        <?xml version="1.0" encoding="utf-8"?>
        <selector xmlns:android="http://schemas.android.com/apk/res/android">
            <item android:color="?colorControlHighlight" android:state_checked="false"/>
            <item android:color="?android:textColorHighlight" android:state_checked="true"/>
        </selector>
        

        属性“?android:textColorHighlight”是您的强调色,但具有正确的透明度以在涟漪中使用它(我认为是 26%)。

        此外,您应该在 drawable/bg_checkbox_ripple.xml 中为 API 21 之前的设备提供后备

        <?xml version="1.0" encoding="utf-8"?>
        <selector
            xmlns:android="http://schemas.android.com/apk/res/android"
            android:exitFadeDuration="@android:integer/config_shortAnimTime">
            <item>
                <shape android:innerRadius="24dp" android:shape="oval">
                    <solid android:color="@color/checked_accent_statelist"/>
                </shape>
            </item>
        </selector>
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2016-08-05
          • 2014-06-29
          • 2015-01-14
          • 1970-01-01
          相关资源
          最近更新 更多