37

我在一个活动的底部使用了一个框架布局,为了在片段上显示阴影效果,我添加了 android:elevation。但是阴影效果只出现在底部而不是顶部,任何人都可以给我一些建议吗?

<FrameLayout
    android:id="@+id/bottom_container"
    android:background="#00737f"
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_gravity="bottom"
    android:elevation="4dp"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="50dp"/>
4

1 回答 1

34

有一个技巧可以用来在视图上方显示阴影。

基本上我们必须使用两个嵌套布局,其中外部布局使用 an 投射阴影,elevation内部布局设置background. 然后通过将 a 设置padding为外部 Layout,我们可以将内部 Layout 向下移动,而不移动阴影,从而使更多的阴影变得可见:

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="50dp"
    android:layout_alignParentBottom="true"
    android:layout_marginBottom="50dp"
    android:elevation="4dp"
    android:outlineProvider="bounds"
    android:paddingTop="2dp"
    android:layout_marginTop="-2dp">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:background="#00737f">

        <!-- content -->

    </FrameLayout>

</FrameLayout>

这里重要的是属性outlineProvider,即使没有设置背景,也需要使外部布局投射阴影。

此外,我们指定一个负数margin来补偿填充创建的偏移量。根据用例,我们可以省略它。

但注意:如果我们将 View 移动太多,一些渲染伪影会变得可见:

android高程阴影偏移示例

这个例子在 Github 上的来源

于 2016-04-21T20:10:20.557 回答