如何在简单布局中创建波纹效果

Posted

技术标签:

【中文标题】如何在简单布局中创建波纹效果【英文标题】:How to create ripple effect in simple layout 【发布时间】:2015-01-16 08:21:17 【问题描述】:

触摸布局时如何在简单的线性/相对布局中产生涟漪效果?

我尝试将布局的背景设置为:

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

    <item android:drawable="@android:color/white"/>

</ripple>

但是,在触摸布局时,我只看到纯白色背景并且没有涟漪效应。我做错了什么?

编辑:

作为参考,这是我的布局 xml 文件:

<?xml version="1.0" encoding="utf-8"?>
    <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
        android:layout_
        android:layout_
        android:background="@drawable/test"
        android:clickable="true">
    </RelativeLayout>

【问题讨论】:

托管波纹的视图需要启用并且可以点击或聚焦。 感谢 Alanv,我的回复见下文。基本上我将我的布局标记为可点击的涟漪效果,但它仍然不起作用。 另外,如果我删除 &lt;item android:drawable="@android:color/white"/&gt; 部分,这会很好。因此,如果我想要布局上的背景颜色,我不确定这应该如何工作。将它放在另一个具有背景颜色的布局之上也行不通! 在您的视图中绘制的波纹是什么颜色,例如colorControlHighlight 解析成什么颜色? 【参考方案1】:

在您的布局上设置这些属性(如果您的布局具有默认的白色/浅色背景):

          android:clickable="true"
          android:focusable="true"
          android:background="?attr/selectableItemBackground"

在这种情况下,您不需要自定义可绘制对象。

但是,如果您的布局具有黑色/深色背景,则您必须创建自己的波纹可绘制对象,如下所示:

<?xml version="1.0" encoding="utf-8"?>
<!-- An white rectangle ripple. -->
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    android:color="@android:color/white">
    <item
        android:id="@android:id/mask"
        android:gravity="center">
        <shape android:shape="rectangle">
            <solid android:color="@android:color/white"/>
        </shape>
    </item>
</ripple>

然后将这个可绘制的波纹设置为您的 android:background 属性。

您可以在 AOSP 中看到许多此类涟漪的示例:in here

【讨论】:

如果我必须给不同的颜色作为背景怎么办?那么最好的方法应该是什么? @AnujSharma 你试过为background提供颜色资源吗? @ralphspoon 见***.com/questions/26604134/… 如果您想要另一种背景颜色,您可以将该颜色设置为背景并将“?attr/selectableItemBackground”设置为 android:foreground 哇!这很棒。这应该标记为答案 +1【参考方案2】:

除了Igor Ganapolsky 的答案之外,我还添加了这个,以防有人想要拥有不同颜色的布局并产生连锁反应。您只需像这样在可绘制对象中创建涟漪效果:

ripple.xml

<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="@color/rippleColor"
    tools:targetApi="lollipop"> <!-- ripple effect color -->
    <item android:id="@android:id/background">
        <shape android:shape="rectangle">
            <solid android:color="@color/backgroundColor" /> <!-- background color -->
        </shape>
    </item>
</ripple>

然后将其作为布局的背景或Igor Ganapolsky 在他的回答中提到的任何按钮。

android:clickable="true"
android:background="@drawable/ripple"

【讨论】:

【参考方案3】:

您必须在任何小部件中更改以下代码 sn-p (TextView/Button) 才能实现涟漪效应

android:clickable="true"
android:focusable="true"
android:foreground="?attr/selectableItemBackground"

你可以走了。

【讨论】:

嗯前景?这太棒了! 如果您已经有一个 android:background="@color/colorAccent" 集,这很有帮助 这适用于布局和自定义视图以及小部件。 @MichaelKern 是的,你是对的,这也是基于每个人在代码中的要求。 请注意,foreground 属性已添加到 API 23 (Android 6.0) 和 has no effect on API levels lower than 23(根据 Android Studio 警告)【参考方案4】:

事实证明这是按预期工作的。标准 Material 主题 colorControlHighlight 值为#40ffffff。所以在白色背景上,这不会出现。将突出显示颜色更改为其他颜色,和/或更改对象的背景颜色。

谢谢大家(尤其是 Alanv 为我指明了正确的方向)。

【讨论】:

如果我在视图中使用 android:background="?attr/selectableItemBackground" 如何更改对象的背景? 没关系我发现selectableItemBackground默认状态是透明的。所以,我在它下面设置了一个我想要的颜色的视图。 快速提示:您可以在您的styles.xml 中更改colorControlHighlight。例如,将其添加到您的自定义主题中。【参考方案5】:

这是单击具有波纹效果的示例布局的示例:

 <LinearLayout
    android:layout_
    android:layout_
    android:background="?attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:orientation="vertical">

【讨论】:

这简直太棒了,这太简单了,而且这个简单的事实就是 Just Works™。【参考方案6】:

在你的布局上设置android:clickable="true"

【讨论】:

【参考方案7】:
<?xml version="1.0" encoding="utf-8"?>
<ripple xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:color="#cfd8dc"
    tools:targetApi="lollipop">
    <item android:id="@android:id/mask">
        <shape android:shape="rectangle">
            <solid android:color="#d1c4e9" />
        </shape>
    </item>
</ripple>

在Drawable文件夹中使用这个ripple.xml,然后将其分配为View的

android:background="@drawable/ripple"

android:clickable="true"

【讨论】:

【参考方案8】:

只需使用android:background="?selectableItemBackground" 添加默认的波纹效果

点赞:

<LinearLayout
            android:layout_
            android:layout_
            android:background="?selectableItemBackground"
            android:clickable="true"
            >

           ...

</LinearLayout>

【讨论】:

【参考方案9】:

把它放到你的布局中:

android:clickable="true"
android:background="?attr/selectableItemBackground"

注意:API 文档中有一个错误。它仅适用于 API >= 23

对于所有 API 级别,请使用此Solution

【讨论】:

您的链接重定向同一页面 请记住,您还可以选择使用 android:background="?attr/selectableItemBackgroundBorderless" 由于它是无边框的,涟漪效应将延伸到父视图。在许多情况下,这可能看起来更好。【参考方案10】:

我尝试了所有这些答案,但对我没有任何效果,因此,我解决了创建以下样式的问题:

<style name="Button.Borderless" parent="Base.Widget.AppCompat.Button.Borderless">
    <item name="android:minHeight">0dp</item>
    <item name="android:minWidth">0dp</item>
    <item name="android:layout_marginLeft">-6dp</item>
    <item name="android:layout_marginRight">-6dp</item>
    <item name="android:paddingTop">0dp</item>
    <item name="android:paddingBottom">0dp</item>
    <item name="android:paddingLeft">6dp</item>
    <item name="android:paddingRight">6dp</item>
</style>

然后,我应用到我的线性布局:

<LinearLayout
      android:id="@+id/ll_my_ripple"
      style="@style/Button.Borderless">
</LinearLayout>

【讨论】:

以上是关于如何在简单布局中创建波纹效果的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android Studio 1.4 中创建横向布局

imageview 上的波纹效果

如何在iphone中创建烟雾效果?

波纹效果不会超出 ImageView

如何使用 HTML5 Canvas 制作水波纹效果

如何在 React 中创建多个布局?