Android"海拔"没有显示阴影

Agg*_*Dev 253 android shadow material-design android-elevation

我有一个ListView,每个列表项我希望它在它下面显示一个阴影.我正在使用Android Lollipop的新高程功能在View上设置一个我想要投射阴影的Z,并且我已经使用ActionBar(技术上是Lollipop中的工具栏)有效地做到了这一点.我正在使用Lollipop的高程,但由于某种原因,它没有在列表项下显示阴影.以下是每个列表项的布局设置方式:

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    android:orientation="vertical"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    >

    <RelativeLayout
        android:layout_width="300dp"
        android:layout_height="300dp"
        android:layout_marginLeft="40dp"
        android:layout_marginRight="40dp"
        android:layout_marginTop="20dp"
        android:layout_marginBottom="20dp"
        android:elevation="30dp"
        >

        <ImageView
            android:id="@+id/documentImageView"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:scaleType="centerCrop" />

        <LinearLayout
            android:orientation="vertical"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:background="@color/alphared"
            android:layout_alignParentBottom="true" >

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentName"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="light"
                android:paddingLeft="16dp"
                android:paddingTop="8dp"
                android:paddingBottom="4dp"
                android:singleLine="true"
                android:text="New Document"
                android:textSize="27sp"/>

            <appuccino.simplyscan.Extra.CustomTextView
                android:id="@+id/documentPageCount"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:textColor="@color/white"
                app:typeface="italic"
                android:paddingLeft="16dp"
                android:layout_marginBottom="16dp"
                android:text="1 page"
                android:textSize="20sp"/>

        </LinearLayout>

    </RelativeLayout>

</RelativeLayout>
Run Code Online (Sandbox Code Playgroud)

但是,这是它如何显示列表项,没有阴影: 在此输入图像描述

我也试过以下无济于事:

  1. 将高程设置为ImageView和TextViews本身而不是父布局.
  2. 将背景应用于ImageView.
  3. 用TranslationZ代替Elevation.

Jus*_*ard 359

我一直在玩Lollipop上的阴影,这是我发现的:

  1. ViewGroup由于某种原因,父母的界限似乎会削弱其子女的影子; 和
  2. 设置的阴影android:elevation是由View边界切断的,而不是通过边缘延伸的边界;
  3. 获取子视图以显示阴影的正确方法是在父级上设置填充并在父级上设置android:clipToPadding="false".

根据我的了解,这是我给你的建议:

  1. 设置您的顶级RelativeLayout以使填充等于您在要显示阴影的相对布局上设置的边距;
  2. 设置android:clipToPadding="false"相同RelativeLayout;
  3. RelativeLayout具有高度设置的边缘移除边距;
  4. [编辑]您可能还需要在需要提升的子布局上设置不透明的背景颜色.

在一天结束时,您的顶级相对布局应如下所示:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:app="http://schemas.android.com/apk/res-auto"
    style="@style/block"
    android:gravity="center"
    android:layout_gravity="center"
    android:background="@color/lightgray"
    android:paddingLeft="40dp"
    android:paddingRight="40dp"
    android:paddingTop="20dp"
    android:paddingBottom="20dp"
    android:clipToPadding="false"
    >
Run Code Online (Sandbox Code Playgroud)

内部相对布局应如下所示:

<RelativeLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="[some non-transparent color]"
    android:elevation="30dp"
    >
Run Code Online (Sandbox Code Playgroud)

  • 谷歌生产这种劣质代码真令人讨厌.我们将不得不考虑这些框架错误多年. (184认同)
  • 谷歌只说(唉):"_Shadows是由高架视图的父级绘制的,因此受标准视图剪辑的限制,默认情况下由父级剪切.". (7认同)
  • 谢谢你!我还发现android:clipChildren ="false"在应用于父相对布局时很有用. (5认同)
  • 在我的情况下,它是透明的颜色.好吧,透明的东西不会投下阴影......哈哈 (5认同)

Dmi*_*nko 271

如果你有一个没有背景的视图,这一行会对你有帮助

android:outlineProvider="bounds"
Run Code Online (Sandbox Code Playgroud)

默认情况下,阴影由视图的背景决定,因此如果没有背景,也不会有阴影.

  • 多么奇怪的是,预览显示了高度但实际设备没有.谢谢,这个解决了这个问题. (11认同)
  • 这种方式对我有用,但在应用于textview时在侧面给出了对角线边框.将背景设置为颜色(与父背景颜色相同)效果更好. (10认同)
  • 如果您的背景是自定义的并且没有"<solid>",这也适用. (4认同)

Joh*_*ick 92

显然,您不能只在视图上设置高程并让它出现.您还需要指定背景.

添加到我的LinearLayout的以下行最终显示阴影:

android:background="@android:color/white"
android:elevation="10dp"
Run Code Online (Sandbox Code Playgroud)


nad*_*ada 41

您应该注意的另一件事是,如果清单中有这一行,阴影将不会显示:

机器人:硬件加速="假"

我尝试了所有建议的东西,但它只对我有用,当我删除线,我有这条线的原因是因为我的应用程序使用了一些位图图像,他们导致应用程序崩溃.


小智 22

如果你有一个没有背景的视图,这一行会对你有帮助

android:outlineProvider="bounds"
Run Code Online (Sandbox Code Playgroud)

如果你有一个背景视图,这一行将对你有所帮助

android:outlineProvider="paddedBounds"
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案是唯一对我有用的解决方案.谢谢 (6认同)
  • 除非您在视图背景上具有半径,否则此方法将起作用,在这种情况下,阴影将显示为矩形显示,但pappedBounds确实适用于具有背景的视图。 (2认同)

小智 17

如果要向按钮元素添加高程,则需要添加以下行:

android:stateListAnimator="@null"
Run Code Online (Sandbox Code Playgroud)

请参阅Android 5.0 android:Elev for View,但不是Button?


odi*_*ity 12

呃,花了一个小时试图解决这个问题.在我的情况下,我有一个背景设置,但它被设置为一种颜色.这还不够,您需要将视图的背景设置为drawable.

这不会有阴影:

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="165dp"
    android:background="@color/ight_grey"
    android:elevation="20dp"
    android:orientation="vertical"
    />
Run Code Online (Sandbox Code Playgroud)

但这会

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="165dp"
    android:background="@drawable/selector_grey"
    android:elevation="20dp"
    android:orientation="vertical"
    />
Run Code Online (Sandbox Code Playgroud)

编辑:还发现如果您使用选择器作为背景,如果您没有角落设置,则阴影将不会显示在预览窗口中,但它将显示在设备上

例如,预览中没有阴影:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <stroke
                android:width="1dp"
                android:color="@color/grey"/>
        </shape>
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)

但这样做:

<selector xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="rectangle">
            <solid android:color="@color/white" />
            <corners android:radius="1dp" />
            <stroke
                android:width="1dp"
                android:color="@color/grey"/>
        </shape>
    </item>
</selector>
Run Code Online (Sandbox Code Playgroud)

  • 与你的第一点完全相反的是,对于我来说,在 RecyclerView 项目中...令人惊讶的是,在经过 5 年的专业 Android 开发之后,我仍然发现必须与这些 API 作斗争的情况:( (3认同)

Hem*_*mar 7

除了已接受的答案之外,还有一个原因,如果手机上的蓝光过滤器功能打开,则海拔可能无法按预期工作。

当我的设备中的海拔完全扭曲且难以忍受时,我就遇到了这个问题。但预览中的高度很好。关闭手机上的蓝光过滤器解决了该问题。

所以即使设置后

android:outlineProvider="bounds"
Run Code Online (Sandbox Code Playgroud)

海拔无法正常工作,那么您可以尝试修改手机的颜色设置。


Tim*_*enn 7

添加背景颜色对我有帮助.

<CalendarView
    android:layout_width="match_parent"
    android:id="@+id/calendarView"
    android:layout_alignParentTop="true"
    android:layout_alignParentStart="true"
    android:layout_height="wrap_content"
    android:elevation="5dp"

    android:background="@color/windowBackground"

    />
Run Code Online (Sandbox Code Playgroud)