为什么使用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>
并从按钮中删除高度 属性,因为它将被动画师覆盖。
我做了一个按钮,如图所示。
但是我点击按钮的时候没有出现点击效果
原因在于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>
并从按钮中删除高度 属性,因为它将被动画师覆盖。