Android海拔没有在按钮上显示阴影

Posted

技术标签:

【中文标题】Android海拔没有在按钮上显示阴影【英文标题】:Android elevation not showing shadow on Button 【发布时间】:2016-11-11 16:52:01 【问题描述】:

无法显示按钮阴影。

将我的代码精简为最小示例:

activity_main.xml

<?xml version="1.0" encoding="utf-8"?>
<ScrollView xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_
    android:layout_>

    <LinearLayout
        android:id="@+id/main_layout"
        android:layout_
        android:layout_>

        <RelativeLayout
            android:layout_
            android:layout_
            android:layout_marginTop="10dp"
            android:layout_marginLeft="10dp">

            <Button
                android:id="@+id/my_button"
                android:layout_
                android:layout_
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="20dp"
                android:elevation="10dp"
                android:translationZ="10dp"
                android:background="@android:color/holo_green_light"
                android:text="BUTTON"/>

        </RelativeLayout>

    </LinearLayout>

</ScrollView>

我需要那种布局结构。

MainActivity.java

public class MainActivity extends AppCompatActivity 

    @Override
    protected void onCreate(Bundle savedInstanceState) 
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    


阴影在 Android Studio 设计器中可见:

但在运行时不显示:

测试日期:

Genymotion Google Nexus 5X - Marshmallow 6.0.0 - API 23 Genymotion Google Nexus 5 - Lollipop 5.1.0 - API 22 Genymotion 三星 Galaxy S2 - 果冻豆 4.1.1 - API 16 硬件设备,三星 Galaxy S5 mini - KitKat 4.4.2 - API 19

结果都一样。

我正在使用:

Android Studio 2.1.2 minSdkVersion 16 targetSdkVersion 24

请在 Andriod Studio 中创建一个新项目,Empty Activity 模板,然后将该代码复制并粘贴到 activity_main.xmlMainActivity.java 中,以便您测试并告诉我。

【问题讨论】:

直接将您的按钮添加到 ScrollView 并查看它是否显示阴影。这可能是由于包装了 Linear 和 RelativeLayout 。检查此链接以供参考***.com/questions/35289356/… 没有这样的属性layout_topLeft 用于任何View..!! @jankigadhiya 是的,你是对的,而且在 Material design 中 android:elevation="2dp"android:translationZ="2dp" 仅在您设置 android:stateListAnimator="@null" 时才有效,否则它是默认属性。 是的,示例代码中有一个错误,没有 layout_topLeft。已编辑。还在检查。谢谢! 【参考方案1】:

Material 下的默认Button 样式有一个StateListAnimator 控制android:elevationandroid:translationZ 属性。

copied from here

只需将此属性添加到您的Button。您可以使用android:stateListAnimator 属性设置您自己的属性。

android:stateListAnimator="@null"

完整代码:

        <Button
                android:id="@+id/my_button"
                android:layout_
                android:layout_
                android:layout_centerHorizontal="true"
                android:layout_marginLeft="20dp"
                android:elevation="2dp"
                android:translationZ="2dp"
                android:stateListAnimator="@null"
                android:background="@android:color/holo_green_light"
                android:text="BUTTON">

更新日期:

为了理解,我将其设置为 10dp..

xml代码:

<RelativeLayout
        android:layout_
        android:layout_
        android:layout_margin="20dp">

        <Button
            android:id="@+id/my_button"
            android:layout_
            android:layout_
            android:layout_centerHorizontal="true"
            android:layout_marginLeft="20dp"
            android:elevation="10dp"
            android:translationZ="10dp"
            android:stateListAnimator="@null"
            android:background="@android:color/holo_green_light"
            android:text="BUTTON"/>

    </RelativeLayout>

【讨论】:

它有效!但它适用于任何具有 API 级别 21 或更高级别的模拟器。它不适用于 API 20 或更低版本。我将提出另一个关于较低 api 替代方案的问题。谢谢! 像素完美警报:请注意,为Buttons 父级设置的wrap_content 高度正在切割顶部和底部阴影,如屏幕截图所示。始终记住调整适当的边距【参考方案2】:

它在我的情况下工作,试试看app:elevation

<Button
    android:id="@+id/my_button"
    android:layout_
    android:layout_
    android:layout_centerHorizontal="true"
    android:layout_marginLeft="20dp"
    android:layout_topLeft="20dp"
    app:elevation="2dp"
    android:translationZ="2dp"
    android:background="@android:color/holo_green_light"
    android:text="BUTTON">

【讨论】:

“意外的命名空间前缀..” app: 按钮中没有前缀 天啊.. 你必须先添加命名空间。如果您不知道,请不要投票。告诉我添加更多规范。我会解释的。 即使你添加了应用命名空间,默认stateListAnimator 会覆盖两个命名空间中的elevation。之前的评论写的很匆忙【参考方案3】:

如果海拔不适用于您的视图,您需要设置android:outlineProvider="bounds"

(我已经为示例简化了下面的代码)

查看:

<View
    android:id="@+id/view"

    android:layout_
    android:layout_

    android:outlineProvider="bounds"
    android:elevation="20dp" >

结果:

【讨论】:

以上是关于Android海拔没有在按钮上显示阴影的主要内容,如果未能解决你的问题,请参考以下文章

工具栏默认没有阴影?

Fab按钮带有显示阴影的图标(Android 4.1)

按钮上的阴影颜色取决于 XML 中的状态 - Android

关于button去掉自带阴影效果的方法

在棒棒糖前设备的工具栏上添加高程/阴影

高度和阴影