为什么使用stateListAnimator时点击效果消失属性?

Why does the click effect disappear when using the stateListAnimator property?

我做了一个按钮,如图所示。

但是我点击按钮的时候没有出现点击效果

原因在于stateListAnimator="@null"属性.

清除此 属性 没有提升效果。

此外,如果您不将 backgroundTint 应用于 white,则 shaodw 不可见。

这是必须的 属性,因为我想要对按钮产生 elevation 效果。

第二种方法是使用 OutLineButton.

这也创建了我想要的类似设计,但仅应用 1dp of elevation 效果即可 过度抬高效果。

我也不知道为什么。

我该怎么办?

为什么会这样?

<Button
    android:id="@+id/delete_set"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:backgroundTint="@color/white"
    android:drawableLeft="@drawable/ic_remove_routine"
    android:text="DELETE SET"
    android:textSize="12dp"
    android:textColor="@color/orgin_text_color"
    android:elevation="10dp"
    android:stateListAnimator="@null"
    android:layout_marginTop="10dp"
    android:layout_marginLeft="1dp"
    android:layout_marginRight="1dp"
/>
<Button
    android:id="@+id/add_set"
    android:layout_width="0dp"
    android:layout_height="wrap_content"
    android:drawableLeft="@drawable/ic_add_routine"
    android:backgroundTint="@color/white"
    android:text="ADD SET"
    android:textSize="12dp"
    android:textColor="@color/orgin_text_color"
    android:elevation="10dp"
    android:stateListAnimator="@null"
    android:layout_marginTop="10dp"
    android:layout_marginLeft="1dp"
    android:layout_marginRight="1dp"
 />

实际上,您要删除默认的 StateListAnimator,顾名思义,您要取消负责根据状态为按钮设置动画的 属性,因此按钮的行为符合预期。请注意,StateListAnimator 中的高度 属性 会覆盖按钮本身的 属性。

要实现您想要的效果,您应该实现自定义的,而不是将 StateListAnimator 设置为 null。作为参考,您可以查看默认动画器 here.

为此,您可以在 dimens.xml 中定义一个维度,如下所示:

<dimen name="my_button_elevation">10dp</dimen>

然后,在 animator/ 文件夹中创建一个 xml 资源,例如 my_button_animator.xml 使用以下内容内容:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:state_pressed="true" android:state_enabled="true">
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="100"
                            android:valueTo="4dp"
                            android:valueType="floatType"/>
            <objectAnimator android:propertyName="elevation"
                            android:duration="0"
                            android:valueTo="@dimen/my_button_elevation"
                            android:valueType="floatType"/>
        </set>
    </item>
    <!-- base state -->
    <item android:state_enabled="true">
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="100"
                            android:valueTo="0"
                            android:startDelay="100"
                            android:valueType="floatType"/>
            <objectAnimator android:propertyName="elevation"
                            android:duration="0"
                            android:valueTo="@dimen/my_button_elevation"
                            android:valueType="floatType" />
        </set>
    </item>
    <item>
        <set>
            <objectAnimator android:propertyName="translationZ"
                            android:duration="0"
                            android:valueTo="0"
                            android:valueType="floatType"/>
            <objectAnimator android:propertyName="elevation"
                            android:duration="0"
                            android:valueTo="0"
                            android:valueType="floatType"/>
        </set>
    </item>
</selector>

终于可以使用属性如下

<item name="android:stateListAnimator">@animator/my_button_animator</item>

并从按钮中删除高度 属性,因为它将被动画师覆盖。