Android的“海拔”不显示阴影Android的“海拔”不显示阴影(Android “elevat

2019-05-10 10:25发布

我有一个ListView,并与各列表项我想让它显示下面还有阴影。 我使用的系统为Android Lollipop的新提升功能设置上,我希望蒙上了阴影查看一个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>

然而,这里是如何显示列表项,没有影子:

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

  1. 将抬高到的ImageView和TextViews本身,而不是父母的布局。
  2. 应用背景的ImageView的。
  3. 使用TranslationZ到位高程。

Answer 1:

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

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

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

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


Answer 2:

如果你有一个观点,没有背景的这条线将帮助您

android:outlineProvider="bounds"

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



Answer 3:

显然,你不能只是设置视图上海拔有它出现。 您还需要指定一个背景。

添加到我的LinearLayout以下行终于露出了一层阴影:

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


Answer 4:

你应该知道的,如果你有在清单此行的阴影不会出现另一件事情:

机器人:硬件加速=“假”

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



Answer 5:

如果要添加高程一个按钮元素,你需要添加下面一行:

android:stateListAnimator="@null"

见的是Android 5.0的android:海拔Works的视图,而不是按钮?



Answer 6:

如果你有一个观点,没有背景的这条线将帮助您

android:outlineProvider="bounds"

如果你有背景图这条线将帮助您

android:outlineProvider="paddedBounds"


Answer 7:

哎,只花了一个小时试图弄清楚这一点。 在我来说,我有一个背景设定,但是它被设置为一个颜色。 这是不够的,你需要有设置为绘制视图的背景。

例如,这会不会有阴影:

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

编辑:还发现,如果你使用一个选择作为背景,如果你不具备角落设置,那么阴影将不会在预览窗口中显示出来,但它会显示在设备上

例如,这并不一定在预览阴影:

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


Answer 8:

添加背景颜色帮助了我。

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

    />


Answer 9:

如果你想拥有透明背景和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的[编辑]文档()表示,它是特定于如何绘制对象的威胁的alpha。 这是可能的,它总是返回255。在这种情况下,你可以手动提供阿尔法:

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);
    }
}

如果你的观点的背景是默认的颜色#DDFF0000即与阿尔法DDx0 / FFx0 == 0.86 StateListDrawable

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


Answer 10:

有时像background="@color/***"background="#ff33**"不行,我代替background_color与绘制,然后它的工作原理



Answer 11:

给一些背景颜色布局为我工作,如:

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


Answer 12:

添加到接受的答案,也由于其高度可能无法按预期工作一个理由。

如果在手机上的蓝光过滤功能打开

我面临这个问题时,抬高出现在我的设备完全扭曲不堪。 但海拔在预览罚款。 关闭蓝光过滤器上的电话解决了问题。

因此,即使设置后

android:outlineProvider="bounds"

海拔不能正常工作,那么你可以尝试用手机的颜色设置进行修补。



Answer 13:

我相信您的问题从已应用抬升元件来填充其父相对布局的事实造成的。 其父剪辑的所有子视图自己的画布内(并且是处理孩子的影子视图)。 您可以通过应用高程属性最上面的解决这个问题RelativeLayout在你看来XML(根标签)。



Answer 14:

在我的情况了字体的问题。

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


Answer 15:

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



Answer 16:

我花了一些时间做这个工作,终于意识到,当背景是黑色,阴影是不可见



Answer 17:

在我而言,这是造成自定义父组件渲染层类型设置为“软件”:

setLayerType(View.LAYER_TYPE_SOFTWARE, null);

删除这一行做的伎俩。 或者你当然需要评估这是为什么有摆在首位。 在我的情况下,它是支持蜂窝,这是非常为我的项目目前最低SDK后面。



Answer 18:

如果还是没有显示海拔试

    android:hardwareAccelerated="true" 

这肯定会帮助你。



文章来源: Android “elevation” not showing a shadow