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

问题描述

enter image description here

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

但是当我点击按钮时,点击效果没有出现。

原因在于 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,如下所示:

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

然后,在 animator/ 文件夹中创建一个名为 my_button_animator.xml 的 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>

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

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...