【问题标题】:How can I get a large drop shadow on a button?如何在按钮上获得大阴影?
【发布时间】:2021-05-15 02:10:18
【问题描述】:

我已经为此苦苦挣扎太久了。我用一个基本的 Activity 创建了一个新的 Android 项目,它带有一个 Fragment 上的按钮。我的布局如下所示:

<?xml version="1.0" encoding="utf-8"?>
<androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="#fff"
    android:clipToPadding="false"
    android:padding="20dp"
    tools:context=".FirstFragment">

    <TextView
        android:id="@+id/button_first"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="@drawable/buttonback"
        android:elevation="10dp"
        android:paddingStart="20dp"
        android:paddingEnd="20dp"
        android:text="Text"
        android:textColor="@color/black"
        android:translationZ="5dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toTopOf="parent" />

    <Button
        android:id="@+id/button_other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:background="@drawable/buttonback"
        android:elevation="10dp"
        android:text="Button"
        android:textColor="@color/black"
        android:translationZ="5dp"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/button_first" />
</androidx.constraintlayout.widget.ConstraintLayout>

无论我尝试什么按钮投影都不会改变。高程、TranslationZ、更改主题...始终只是按钮周围略微可见的轮廓。我已经尝试过在 SO 上发布的所有内容,例如 this popular post,但没有任何效果或改变投影。似乎谷歌正在强制按钮没有阴影,因为 textView 阴影确实有效。这里有 2 个视图,一个 textview 和一个具有相同属性的按钮:

textview 在顶部,并且有我想要的阴影。那么诀窍是什么?如何在按钮上获得相同的阴影?顺便说一句,当我按下按钮时似乎确实有阴影,但我希望按钮在未按下时有阴影。

PS。令人讨厌的是,按钮阴影出现在布局设计编辑器中……但在设备上编译和运行时不会出现。

【问题讨论】:

  • @WhatAJerk,该帖子建议创建一个假阴影对象并将其放在按钮后面。我不敢相信这将是正确的解决方案。动画或按下按钮时看起来不太好

标签: android android-layout


【解决方案1】:

看来我是对的,Google 确实以不同的方式处理按钮。问题是一个名为stateListAnimator 的属性。它似乎覆盖了海拔和平移Z,使它们无用。您可以通过将此行添加到您的按钮 XML 来解决问题:

android:stateListAnimator="@null"

那么您的海拔和平移Z 属性将正常工作。一个更好的解决方案是创建您自己的 stateListAnimator。为此,在您的 res 文件夹下创建一个名为 animator 的目录,然后向其中添加一个名为 button_with_shadow.xml 的新动画器资源文件。这是一个运行良好的示例:

<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:state_enabled="true"
        android:state_pressed="true">
        <set>
            <objectAnimator
                android:duration="50"
                android:propertyName="translationZ"
                android:valueTo="2dp"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="50"
                android:propertyName="textSize"
                android:valueFrom="15sp"
                android:valueTo="14sp"
                android:valueType="floatType" />
        </set>
    </item>
    <item
        android:state_enabled="true"
        android:state_pressed="false">
        <set>
            <objectAnimator
                android:duration="50"
                android:propertyName="translationZ"
                android:valueTo="10dp"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="50"
                android:propertyName="textSize"
                android:valueFrom="14sp"
                android:valueTo="15sp"
                android:valueType="floatType" />
        </set>
    </item>
    <item android:state_enabled="false">
        <set>
            <objectAnimator
                android:duration="50"
                android:propertyName="translationZ"
                android:valueTo="1dp"
                android:valueType="floatType" />
            <objectAnimator
                android:duration="50"
                android:propertyName="textSize"
                android:valueFrom="15sp"
                android:valueTo="14sp"
                android:valueType="floatType" />
        </set>
    </item>
</selector>

应该很容易看出这里发生了什么。这是通过按钮 XML:

    <Button
        android:id="@+id/button_other"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="32dp"
        android:paddingStart="30dp"
        android:paddingEnd="30dp"
        android:textSize="15sp"
        android:background="@drawable/buttonback"
        android:stateListAnimator="@animator/button_with_shadow"
        android:text="Button"
        android:textColor="@color/black"
        app:layout_constraintEnd_toEndOf="parent"
        app:layout_constraintStart_toStartOf="parent"
        app:layout_constraintTop_toBottomOf="@id/myText" />

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-08-17
    • 2016-11-23
    • 1970-01-01
    • 2015-04-29
    • 2013-02-26
    • 1970-01-01
    相关资源
    最近更新 更多