Android“elevation"没有影子

我有一个ListView,对于每个列表项,我希望它在它下面显示一个阴影。我正在使用Android棒棒糖的新提升功能来设置一个Z视图上,我想投射一个阴影,并且已经有效地与动作栏(技术上的棒棒糖工具栏)。我使用的是棒棒糖的抬高,但出于某种原因,它在列表项下没有显示阴影。下面是每个列表项的布局设置:

<?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>
然而,下面是它如何显示列表项,没有阴影: enter image description here

我也尝试过以下方法,但都无济于事:

  1. 将提升设置为ImageView和TextViews本身,而不是父布局。
  2. 应用了ImageView的背景。
  3. 使用TranslationZ代替Elevation。
312965 次浏览

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

  1. 似乎父对象ViewGroup的边界出于某种原因截断了子对象的阴影;而且
  2. android:elevation设置的阴影被View的边界截断,而不是通过边缘扩展的边界;
  3. 让子视图显示阴影的正确方法是在父视图上设置padding,并在父视图上设置android:clipToPadding="false"

根据我所知道的,以下是我对你的建议:

  1. 设置顶层的RelativeLayout,使padding等于你在想要显示阴影的相对布局上设置的边距;
  2. 在相同的RelativeLayout上设置android:clipToPadding="false";
  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"
>

内部相对布局应该是这样的:

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

如果你的视野没有背景,这条线会对你有帮助

android:outlineProvider="bounds"

默认情况下,阴影是由视图的背景决定的,所以如果没有背景,也就没有阴影。

我相信你的问题源于这样一个事实,即你已经将海拔元素应用到一个相对布局,填补其父。它的父视图在它自己的绘图画布中剪辑所有子视图(并且是处理子阴影的视图)。你可以通过对view xml中最顶层的RelativeLayout(根标签)应用一个elevation属性来修复这个问题。

显然,你不能只是在视图上设置一个立面并让它显示出来。您还需要指定一个背景。

下面的线条添加到我的线性布局最终显示一个阴影:

android:background="@android:color/white"
android:elevation="10dp"

除了公认的答案之外,还有一个原因是,如果手机上的蓝光滤镜功能是打开的,那么抬高可能无法正常工作。

我正面临着这个问题,因为在我的设备中,高度完全扭曲,无法忍受。但在预览中,立面是好的。关闭手机上的蓝光滤镜解决了这个问题。

所以即使在设置之后

android:outlineProvider="bounds"

抬高工作不正常,那么你可以试着修补手机的颜色设置。

添加背景色对我有帮助。

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


/>

我花了一个小时才想明白。在我的例子中,我有一个背景设置,但它被设置为一种颜色。这还不够,你需要将视图的背景设置为可绘制的。

< p >。 这将没有阴影:

<LinearLayout
android:layout_width="match_parent"
android:layout_height="165dp"
android:background="@color/ight_grey"
android:elevation="20dp"
android:orientation="vertical"
/>

但是这个会

<LinearLayout
android:layout_width="match_parent"
android:layout_height="165dp"
android:background="@drawable/selector_grey"
android:elevation="20dp"
android:orientation="vertical"
/>
< p >编辑: 还发现,如果你使用选择器作为背景,如果你没有设置角,那么阴影不会显示在预览窗口中,但它会显示在设备上

例:在预览中没有阴影:

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

但这确实是:

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

还有一件事你应该知道,如果你在清单中有这一行,阴影将不会显示:

< em > android: hardwareAccelerated = " false " < / em >

我尝试了所有建议的东西,但它只适用于我,当我删除了行,我有行的原因是因为我的应用程序与许多位图图像工作,他们导致应用程序崩溃。

如果你想要透明的背景,而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);
}
}

将这个提供者设置为你的透明视图:

transparentView.setOutlineProvider(new TransparentOutlineProvider());
< p >来源: https://code.google.com/p/android/issues/detail?id=78248#c13 < / p > < p >[编辑] Drawable. getalpha()的文档说它是特定于Drawable如何威胁alpha的。它可能总是返回255。 在这种情况下,您可以手动提供alpha:

class TransparentOutlineProvider extends ViewOutlineProvider {


private float mAlpha;


public TransparentOutlineProvider(float alpha) {
mAlpha = alpha;
}


@Override
public void getOutline(View view, Outline outline) {
ViewOutlineProvider.BACKGROUND.getOutline(view, outline);
outline.setAlpha(mAlpha);
}
}

如果你的视图背景是一个StateListDrawable,默认颜色为#DDFF0000,即alpha DDx0/FFx0 == 0.86

transparentView.setOutlineProvider(new TransparentOutlineProvider(0.86f));

有时像background="@color/***"background="#ff33**"不能工作,我用drawable替换background_color,然后它就工作了

如果你要添加一个按钮元素的高度,你需要添加以下行:

android:stateListAnimator="@null"

看到Android 5.0 Android:elevation Works for View, but not Button?

给布局一些背景色对我有用 如:< / p >

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

在我的案例中,字体是问题所在。

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

<TextView
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@android:color/white"
android:elevation="3dp"
android:gravity="center"
android:text="@string/fr_etalons_your_tickets"
android:textAllCaps="true"
android:textColor="@color/blue_4" />

2)与fontFamily我必须添加android:outlineProvider="bounds"设置:

<TextView
android:fontFamily="@font/gilroy_bold"
android:layout_width="match_parent"
android:layout_height="44dp"
android:background="@android:color/white"
android:elevation="3dp"
android:gravity="center"
android:outlineProvider="bounds"
android:text="@string/fr_etalons_your_tickets"
android:textAllCaps="true"
android:textColor="@color/blue_4" />

我在父布局上设置clipChildren="false"时有一些运气。

如果你的视野没有背景,这条线会对你有帮助

android:outlineProvider="bounds"

如果你有一个背景视图,这条线将帮助你

android:outlineProvider="paddedBounds"

我花了一些时间来处理它,最终意识到当背景是黑暗的时候,阴影是看不见的

在我的例子中,这是由自定义父组件将渲染层类型设置为“软件”引起的:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

去掉这条线就成功了。当然,你需要先评估一下为什么会有这个。在我的案例中,它是为了支持Honeycomb,它远远落后于我的项目目前的最低SDK。

如果仍然没有显示仰角,请尝试

    android:hardwareAccelerated="true"

这绝对对你有帮助。

也检查你是否没有改变该视图上的alpha。我正在调查问题,当我改变alpha在一些观点,与海拔。 当alpha改变并改变回1f时,它们只是松散的仰角。

设置android: clipToPadding =“false"在顶部相对布局就解决了这个问题。

设置布局或视图的背景色

对我来说,设置立面、背景和边缘非常有效。

android:layout_marginStart="5dp"
android:layout_marginEnd="5dp"
android:background="@drawable/card_view" //any drawable or color
android:elevation="4dp"

在父布局中设置clipChildren和clipToPadding对我来说很有效

android:clipChildren="false"
android:clipToPadding="false"