创建一个不透明的可绘制波纹

Posted

技术标签:

【中文标题】创建一个不透明的可绘制波纹【英文标题】:Create a ripple drawable without transparency 【发布时间】:2015-01-14 01:55:55 【问题描述】:

我对如何正确使用 Ripple Drawable 有点迷茫。

假设我有这个drawable:

<?xml version="1.0" encoding="utf-8"?>

<selector xmlns:android="http://schemas.android.com/apk/res/android" >
     <item android:state_pressed="false" android:state_focused="true" android:drawable="@color/accent_color_light" />
     <item android:state_pressed="true" android:drawable="@color/accent_color_light" />
     <item android:drawable="@android:color/white" />
</selector>

所以它是一个纯白色的背景,当它被聚焦或按下时会变成浅蓝色。

我怎样才能获得相同的颜色但具有涟漪效果? 我想我需要使用遮罩来防止它超出视图范围?

【问题讨论】:

【参考方案1】:

忘了回答我自己的问题。

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
   android:exitFadeDuration="@android:integer/config_shortAnimTime"
   android:color="@color/my_color" >

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

</ripple>

id为“mask”的item中的颜色不显示。它用于说明波纹效果的形状和范围。没有它,它可能会超出视图的范围。

【讨论】:

谢谢你!救了我-> ***.com/questions/43531552/… 这意味着我们可以将mask id 下的形状的颜色设置为我们想要的任何颜色并且它不可见?我做对了吗?【参考方案2】:

RippleDrawable 已经是StateListDrawable(即selector) - 所以你可以使用可绘制的波纹作为背景(具有默认状态) - 像这样:

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@color/accent_color_light">
    <item android:id="@android:id/mask">
        <color android:color="@android:color/white" />
    </item>
    <item android:drawable="@android:color/white" />
</ripple>

遮罩部分限制了波纹(实际上,上面的 sn-p,减去颜色和设置非按压背景的最后一个 android:drawable)是棒棒糖中使用的 default list selector。

【讨论】:

以上是关于创建一个不透明的可绘制波纹的主要内容,如果未能解决你的问题,请参考以下文章

delphi 怎样绘制半透明窗体,只让窗体背景半透明,而窗体里面的控件 不透明

在半透明框架/面板/组件上重新绘制。

可以在 XML 中创建固定宽度的可绘制对象吗?

如何在 React Native 的平面列表中的可触摸不透明度内执行函数?

如何保持自定义绘制的复选框控件的透明度

Android:半透明覆盖?