Android“海拔”未显示阴影

问题描述 投票:266回答:19

我有一个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>

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

我也尝试了以下无济于事:

  1. 将高程设置为ImageView和TextViews本身,而不是父级布局。
  2. 将背景应用于ImageView。
  3. 使用TranslationZ代替高程。
android material-design shadow android-elevation
19个回答
371
投票

我一直在棒棒糖上玩阴影,这是我发现的内容:

  1. [父级ViewGroup的边界似乎出于某种原因切断了其子级的阴影;和
  2. android:elevation设置的阴影被View的边界所截断,而不是通过边距延伸的边界;
  3. 获得子视图以显示阴影的正确方法是在父级上设置填充,并在该父级上设置android:clipToPadding="false"

根据我所知,这是我对您的建议:

  1. 将顶层RelativeLayout设置为具有与您要在其上显示阴影的相对布局上设置的边距相等的边距;
  2. android:clipToPadding="false"设置为相同的RelativeLayout
  3. 从也已设置高程的RelativeLayout中删除边距;
  4. [[EDIT],您可能还需要在需要加高的子布局上设置非透明背景颜色。

最终,您的顶级相对布局应如下所示:

<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"
    >

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

<RelativeLayout
    android:layout_width="300dp"
    android:layout_height="300dp"
    android:background="[some non-transparent color]"
    android:elevation="30dp"
    >

4
投票

如果仍未显示海拔高度,请尝试

    android:hardwareAccelerated="true" 

3
投票

如果您想要透明的背景并且android:outlineProvider="bounds"对您不起作用,则可以创建自定义ViewOutlineProvider:

class TransparentOutlineProvider extends ViewOutlineProvider {

    @Override
    public void getOutline(View view, Outline outline) {
        ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
        Drawable background = view.getBackground();
        float outlineAlpha = background == null ? 0f : background.getAlpha()/255f;
        outline.setAlpha(outlineAlpha);
    }
}

2
投票

为布局提供一些背景颜色对我有用像:

    android:background="@color/catskill_white"
    android:layout_height="?attr/actionBarSize"
    android:elevation="@dimen/dimen_5dp"

1
投票

除了接受的答案之外,还有另一个原因可能导致海拔无法正常工作。

如果手机上的Bluelight滤镜功能已开启


1
投票

我在父版面上设置clipChildren="false"时感到很幸运。


1
投票

我花了一些时间进行研究,最终意识到,当背景较暗时,阴影不可见


0
投票

我相信您的问题源于您已将高程元素应用于填充其父级的相对布局的事实。它的父级将所有子级视图剪辑在其自己的绘图画布中(并且是处理子级阴影的视图)。您可以通过在视图xml(根标签)中最顶部的RelativeLayout上应用一个height属性来解决此问题。


0
投票

就我而言,字体是问题所在。

1]没有fontFamily,我需要将android:background设置为某个值。


0
投票

就我而言,这是由于自定义父组件将渲染层类型设置为“软件”引起的:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

0
投票

还要检查您是否在该视图上不更改Alpha。当我在某些视图中使用高程更改Alpha时,我正在调查问题。当更改alpha并将其更改回1f时,它们只是松开了标高。


278
投票

如果您的视图没有背景,此行将为您提供帮助>>

android:outlineProvider="bounds"

默认情况下,阴影是由视图的背景决定的,因此,如果没有背景,也将没有阴影。


97
投票

显然,您不能仅在视图上设置高程并使其显示。您还需要指定背景。


43
投票

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


25
投票

如果您的视图没有背景,此行将为您提供帮助>>

android:outlineProvider="bounds"

18
投票

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

android:stateListAnimator="@null"

12
投票

呃,花了一个小时试图弄清楚。在我的情况下,我有一个背景设置,但是设置为一种颜色。这还不够,您需要将视图的背景设置为可绘制的。

例如这不会有阴影:


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"

    />

4
投票

有时background="@color/***"background="#ff33**"无效,我将background_color替换为drawable,然后它起作用了

© www.soinside.com 2019 - 2024. All rights reserved.