Android 材料设计 - LinearLayout 高度

4

我刚开始学习材料设计,在将阴影(elevation)应用到除了 CardView 以外的元素上时遇到了问题。具体来说,它是否适用于 LinearLayout?

<LinearLayout
            android:paddingTop="10dp"
            android:orientation="vertical"
            android:paddingLeft="@dimen/activity_horizontal_margin"
            android:paddingRight="@dimen/activity_horizontal_margin"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:elevation="2dp">
            <LinearLayout
                android:id="@+id/shareLayout"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:paddingBottom="10dp">

                <ImageView
                    android:id="@+id/shareIcon"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_share_black_48dp"/>
                <TextView
                    android:id="@+id/shareText"
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:paddingLeft="10dp"
                    android:text="@string/action_share"/>
            </LinearLayout>
            <LinearLayout
                android:layout_width="wrap_content"
                android:layout_height="wrap_content">

                <ImageView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:src="@drawable/ic_computer_black_48dp"/>
                <TextView
                    android:layout_width="wrap_content"
                    android:layout_height="wrap_content"
                    android:layout_gravity="center_vertical"
                    android:paddingLeft="10dp"
                    android:text="@string/action_desktop"/>
            </LinearLayout>

        </LinearLayout>

这段代码没有显示任何布局高度,也就是没有阴影。如果我将其放入CardView,则可以起到阴影作用,但是这样会导致无法触发单击事件的问题。我尝试过删除图像,但是没有效果。我是否只需要将想要提高的所有内容都包装在CardView中,还是有其他方法?谢谢。
我正在使用运行Android 5.0.2的Nexus 7进行测试。
更新:
如建议所述,我尝试了轮廓提供程序,结果确实有一个阴影,但是很奇怪。
看起来LinearLayout有点倾斜而不是仅仅被抬高了。更改边距似乎没有帮助。有人有其他想法吗?

LinearLayout 上设置背景。Elevation 仅会从设置了 elevation 的视图的背景投射阴影。 - alanv
你的意思是像一个背景可绘制对象吗?如果我不想要一个实际的背景,我需要将一个透明的图像设置为背景吗?如果你有任何关于这个特性的文档链接,我会非常感激,尽管我知道很多这样的东西并没有得到很好的记录。 - nasch
我也遇到了同样奇怪的阴影问题,但将背景设置为元素后面的颜色(在我的情况下是白色)可以覆盖掉这些阴影。 - 1mike12
1个回答

2

所有视图都可以通过ViewOutlineProvider生成阴影。如果设置了背景,该提供程序将自动从视图的背景生成。阴影采用背景的形状和透明度。要使透明视图投射阴影,您必须设置自己的ViewOutlineProvider:

view.setOutlineProvider(new ViewOutlineProvider() {
    @Override
    public void getOutline(View view, Outline outline) {
        outline.setRect(0, 0, view.getWidth(), view.getHeight());
    }
});

请确保阴影投射器有足够的空间来绘制其阴影。CardView默认会添加自己的填充来实现此目的。


这不是一个透明视图,只是一个没有背景或透明度或任何设置的LinearLayout(我认为LinearLayout默认情况下不透明)。我会尝试调整边距,也许那就是问题所在。 - nasch
1
LinearLayout 本身除了背景外不会绘制任何内容,因此将背景设置为空会使该布局透明。这可能是阴影没有被绘制的原因。 - Zielony
很棒的帖子,只是需要注意的是,“CardView”使用padding而不是margin来为阴影创建空间。 - Anthony

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接