问题描述
我做了一个按钮,如图所示。
但是当我点击按钮时,点击效果没有出现。
原因在于 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>
并从按钮中删除高程属性,因为它会被动画师覆盖。