Lollipop RippleDrawable 与 Pre-Lollipop 的选择器

Posted

技术标签:

【中文标题】Lollipop RippleDrawable 与 Pre-Lollipop 的选择器【英文标题】:Lollipop RippleDrawable vs Selector for Pre-Lollipop 【发布时间】:2014-08-27 17:50:37 【问题描述】:

我有不同 draw9patch png 作为背景的按钮。目前按钮由selector 控制,看起来像这样:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
  <item android:drawable="@drawable/pressed" android:state_pressed="true"/>
  <item android:drawable="@drawable/disabled" android:state_enabled="false"/>
  <item android:drawable="@drawable/focused" android:state_focused="true"/>
  <item android:drawable="@drawable/default"/>
</selector>

对于 Android Lollipop,他们有一个用于触摸效果的 RippleDrawable,如下所示:

<ripple xmlns:android="http://schemas.android.com/apk/res/android" android:color="?android:colorControlHighlight">
    <item>
    ...
    </item>
</ripple>

关于新的触摸涟漪效果:

1:我可以将draw9patch设置为RippleDrawable的背景吗?

2:我要如何适应上述两种不同的xml我想遵循Material design?我是否必须为新的RippleDrawable 分配一个新的文件夹/布局 xml?

【问题讨论】:

我不认为你可以应用 9png 作为背景。您可以为您的rippleDrawable 应用颜色。 【参考方案1】:

1) 是的。有关如何合成图层的更多详细信息,请参阅 RippleDrawable 的文档,但基本上你想要:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
    <item android:drawable="@drawable/yourninepatch" />
</ripple>

或者也以干净的方式处理禁用状态,您可能想要:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="?android:attr/colorControlHighlight">
    <item>
        <selector>
            <item android:state_enabled="false">
                <nine-patch
                    android:src="@drawable/yourninepatch"
                    android:alpha="?android:attr/disabledAlpha" />
            </item>
            <item>
                <nine-patch android:src="@drawable/yourninepatch" />
            </item>
        </selector>
    </item>
</ripple>

2) 是的,您应该将您的波纹 XML 放在 drawable-v21 中。

【讨论】:

当我将 xml 放入 values-v21 文件夹时,我收到了错误 Element ripple must be declared 对不起,我的意思是drawable-v21目录。 有什么方法可以自动对所有可绘制对象执行此操作?所以我们不必创建复制和粘贴地狱? 再次阅读答案和cmets。它在 drawables-v21 中。 不,你只想要一个波纹元素。通常,您会将其保留为默认的 colorControlHighlight 值,但如果您绝对必须在按下和聚焦时使用不同的波纹颜色,您也可以将颜色设置为颜色状态列表。请记住,只有在启用并按下或聚焦某个项目时,您才会看到涟漪。

以上是关于Lollipop RippleDrawable 与 Pre-Lollipop 的选择器的主要内容,如果未能解决你的问题,请参考以下文章

找不到 RippleDrawable

如何在视图内的特定位置触发 Android Lollipop 的涟漪效应,而不触发触摸事件?

RippleDrawable 遮罩颜色,它是干啥用的?

RippleDrawable - 以编程方式显示波纹效果

找不到类“android.graphics.drawable.RippleDrawable”

android.graphics.drawable.RippleDrawable 错误