使用 android:elevation 在 LinearLayout 上投射阴影

Cast shadow on top of LinearLayout using android:elevation

我有这个 LinearLayout 将被放置在 activity 布局的底部。我希望这个 LinearLayout 有一个 4dp 的高度,就像顶部工具栏应该有的那样,但是,因为 android:elevation 将阴影放在 ui 组件下面并且这个特定组件(linearLayout)正在运行在屏幕底部,我根本看不到任何高度..

这是我的 LinearLayout 代码,以及实现了默认高度的图像:

    <?xml version="1.0" encoding="utf-8"?>
<LinearLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:weightSum="3"
    android:background="@android:color/transparent"
    android:orientation="horizontal"
    android:elevation="4dp"
    android:layout_alignParentBottom="true">

    <ImageButton
        android:id="@+id/playButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="center"
        android:clickable="true"
        android:background="@drawable/bottom_toolbar_menu_selector"
        android:src="@drawable/ic_play"
        style="?android:attr/borderlessButtonStyle" />

    <ImageButton
        android:id="@+id/stopButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="center"
        android:clickable="true"
        android:background="@drawable/bottom_toolbar_menu_selector"
        android:src="@drawable/ic_stop"
        style="?android:attr/borderlessButtonStyle" />

    <ImageButton
        android:id="@+id/bookmarkButton"
        android:layout_width="0dp"
        android:layout_height="match_parent"
        android:layout_weight="1"
        android:scaleType="center"
        android:clickable="true"
        android:background="@drawable/bottom_toolbar_menu_selector"
        android:src="@drawable/ic_bookmark"
        style="?android:attr/borderlessButtonStyle" />

</LinearLayout>

有没有办法,使用 elevation 在 ui 组件顶部放置阴影? 提前致谢!

理论上你不能用 android:elevation 做到这一点,因为你不能选择要投射阴影的方向。

有两种解决方法。

1.可绘制对象

例如,您可以将 ImageView 放在布局的正上方并设置 android:src="@drawable/shadow"。这应该是 XML 中定义的垂直 GradientDrawable,如 here 所述。

2。解决方法

虽然大部分阴影实际上在视图下方,但上方也有细微的阴影。解决方法可能是为 elevation 使用非常高的值,例如 40dp:由于您的布局,底部部分将被隐藏,而顶部将被扩展并看起来像一个普通的阴影.

在任何一种情况下,您都无法控制 dp 中的高程值,因为您无法确定自己的影子是否与 android:elevation=4dp 投射的影子相同。

像这样使用;

<LinearLayout
    android:layout_width="match_parent"
    android:layout_height="205dp"
    android:background="@color/white"
    android:orientation="horizontal">

    <RelativeLayout
        android:layout_width="match_parent"
        android:layout_height="200dp"
        android:layout_marginTop="-5dp"
        android:background="@color/white"
        android:elevation="3dp"
        android:paddingTop="5dp">

        // CHILD VIEWS
    </RelativeLayout>
</LinearLayout>

试试这个我无法通过 xml 设置背景然后我尝试了编程方式来解决这个问题如果在线性布局中显示阴影时遇到问题我可以完美地参考这个

lprofile.setBackgroundResource(R.drawable.background_with_shadow);

lprofile 是我的线性布局参考,background_with_shadow 是应用阴影的 xml 我希望我能满足你的要求...谢谢你..

将此代码添加到您想要顶视图的上方,或者添加 android:layout_marginTop="-4dp" 并添加到上方视图的下方

<android.support.v7.widget.CardView
    android:layout_width="match_parent"
    android:layout_height="0.01dp"
    android:layout_below="@+id/scrollbar"
    app:cardBackgroundColor="@android:color/transparent"
    app:cardCornerRadius="0dp"
    app:cardElevation="@dimen/dp_4" />