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

然而,下面是它如何显示列表项,没有阴影:

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

将提升设置为ImageView和TextViews本身,而不是父布局。 应用了ImageView的背景。 使用TranslationZ代替Elevation。


当前回答

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

android: hardwareAccelerated =“虚假”

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

其他回答

如果你想有透明的背景和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());

来源: https://code.google.com/p/android/issues/detail?id=78248#c13

(编辑) 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));

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

android:outlineProvider="bounds"

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

android:outlineProvider="paddedBounds"

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

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

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

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

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