9

我正在尝试将触摸反馈添加到类似于 API 级别 21 中的常规按钮反馈的 LinearLayout 中,就像在这个示例中一样,并且到目前为止还没有成功。

我已经定义了一个像这样的标准波纹可绘制:

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

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

并使用了 Google在此处提供的 StateListAnimator :

<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:state_enabled="true" android:state_pressed="true">
    <objectAnimator
        android:duration="@android:integer/config_shortAnimTime"
        android:propertyName="translationZ"
        android:valueTo="@dimen/touch_raise"
        android:valueType="floatType" />
</item>
<item>
    <objectAnimator
        android:duration="@android:integer/config_shortAnimTime"
        android:propertyName="translationZ"
        android:valueTo="0dp"
        android:valueType="floatType" />
</item>

在定义动画师和波纹可绘制之后,我将它们添加到我的 LinearLayout 中,如下所示:

<LinearLayout
    android:id="@+id/linearLayout"        
    android:clickable="true"
    android:focusable="true"
    android:orientation="horizontal"
    android:background="@drawable/ripple"
    android:stateListAnimator="@anim/touch_elevation">

这个想法是将此 LinearLayout 用作按钮,因为对我来说插入各种类型的文本并在其中处理 ImageView 定位要简单得多(与按钮可绘制对象相反)。

根据这个问题,只要视图的背景没有透明度,就可以单独添加波纹效果或动画。

我不确定这是否是与上述问题相关的问题,但鉴于标准按钮设法同时使用波纹和高程动画反馈,我认为在其他视图上也可以实现此效果。

对此问题的任何见解将不胜感激。

4

2 回答 2

3

使用ForegroundLinearLayout。它允许将波纹或任何其他可绘制对象放在视图的前景中。您可以创建ForegroundRelativeLayout等相同的方式(只需让这个类从 扩展RelativeLayout)。

这是您的stateListAnimator和波纹可绘制的示例:

<your.package.ForegroundLinearLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:layout_centerInParent="true"
    android:gravity="center"
    android:foreground="@drawable/bg_ripple"
    android:background="#fff"
    android:clickable="true"
    android:stateListAnimator="@animator/animator_elevation">

    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="Hello world!"/>

</your.package.ForegroundLinearLayout>

结果:

在此处输入图像描述

编辑:ForegroundLinearLayout存在于支持设计库中。所以你可以使用 android.support.design.internal.ForegroundLinearLayout

于 2016-09-22T08:52:02.697 回答
1

这两种效果android:id="@android:id/mask"在涟漪的 item 元素中没有属性的情况下一起工作(也许这个属性增加了一些透明度)。

于 2015-01-29T13:55:10.977 回答