【问题标题】:Why does the click effect disappear when using the stateListAnimator property?为什么使用 stateListAnimator 属性时点击效果消失?
【发布时间】:2021-05-26 00:07:01
【问题描述】:

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

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

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

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

而且,如果您不将backgroundTint 应用于whiteshaodw 将不可见。

这是一个必须拥有的属性,因为我想要一个按钮上的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"
 />

【问题讨论】:

    标签: android android-elevation


    【解决方案1】:

    实际上,您正在删除默认的 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>
    

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

    【讨论】:

    • 感谢您的回答。但是,我在duration, valueTo,startDelay(@integer, @dimen) 中收到无法解析符号错误。这是否意味着我应该在名为@integer and a dimen 的文件夹中定义button_pressed_animation_duration 和`button_pressed_z_material`?
    • 哦,当我刚刚设置rippleColor property时,按钮点击效果开始出现我设置的颜色。这正常吗?
    • 对于错误,我已经更新了代码sn-p,将资源id替换为默认值,检查一下。对于涟漪,它是可点击视图中触摸的视觉反馈,因此肯定是预期的行为。查看文档了解更多信息:material.io/develop/ios/components/ripple
    • 谢谢。但是我忘了问startDelay属性应该设置多少?
    • 100 毫秒。我再次更新了代码 sn-p。很抱歉忘记了这一点。
    猜你喜欢
    • 1970-01-01
    • 2013-02-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-26
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多