140

触摸布局时如何在简单的线性/相对布局中产生连锁反应?

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

<?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_width="250dp"
        android:layout_height="250dp"
        android:background="@drawable/test"
        android:clickable="true">
    </RelativeLayout>
4

10 回答 10

308

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

          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 中看到许多此类涟漪的示例:在这里

于 2015-10-02T18:32:27.130 回答
67

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

波纹.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"
于 2016-08-16T20:46:30.317 回答
47

TextView您必须在任何小部件( / )中更改以下代码片段,Button并且可以实现Ripple Effect

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

你很高兴。

于 2017-10-11T05:08:33.547 回答
25

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

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

于 2014-11-20T15:56:37.560 回答
11

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

 <LinearLayout
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:background="?attr/selectableItemBackground"
    android:clickable="true"
    android:focusable="true"
    android:orientation="vertical">
于 2019-02-11T10:55:51.037 回答
9

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

于 2014-11-19T10:11:22.237 回答
5
<?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"

安卓:可点击=“真”

于 2018-08-07T07:39:27.050 回答
2

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

喜欢:

<LinearLayout
            android:layout_width="match_parent"
            android:layout_height="100dp"
            android:background="?selectableItemBackground"
            android:clickable="true"
            >

           ...

</LinearLayout>
于 2018-02-23T16:19:25.470 回答
0

I tries all those answers and nothing worked to me, so, I solved creating the following style:

<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>

And then, I applied to my linear layout:

<LinearLayout
      android:id="@+id/ll_my_ripple"
      style="@style/Button.Borderless">
</LinearLayout>
于 2018-04-03T19:07:45.410 回答
0

把它放到你的布局中:

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

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

对于所有 API 级别,请使用此解决方案

于 2016-09-29T07:12:13.990 回答