如何改变安卓高度阴影的方向?

36

我有一个带有android:elevation="4dp"属性的FrameLayout。这个高度的阴影向下投射。我想改变阴影的方向为向上。

<FrameLayout
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="100dp"
    android:elevation="10dp"
    android:layout_marginBottom="100dp"
    android:background="@color/ColorPrimary"
    android:layout_alignParentBottom="true"
    android:layout_alignParentLeft="true"
    android:layout_alignParentStart="true">
</FrameLayout>

这会不会与 UI 上的其他阴影不一致呢? - Henry
你可以使用XML文件创建自定义阴影背景,而不是使用高程。以下是一个示例想法 - https://dev59.com/cGAf5IYBdhLWcg3w9mts 我认为两者理论上是相同的,但实现方式不同。 - Keyur Thumar
3个回答

31

我认为这种方法是最佳解决方案:Android底部导航栏带有投影。谢谢,Alexander Bilchuk。

解决方案:

您可以使用简单的View及其背景在视图上方绘制自己的阴影:

<View
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:layout_above="@id/bottom_bar"
    android:background="@drawable/shadow"/>

可绘制物(drawable)/阴影.xml:

<shape xmlns:android="http://schemas.android.com/apk/res/android">
    <gradient
        android:startColor="#1F000000"
        android:endColor="@android:color/transparent"
        android:angle="90" />
</shape>

此外,如果使用这种方法,就不会出现兼容性问题。


1
当我这样做时,我看到添加的阴影和按钮之间有一点边距,它看起来不像阴影,并且在滚动周围时不会融入其中。 - reactor
@reactor 这是因为视图实际上占据了布局空间并显示其背景,该空间无法被其下方的其他视图传输。 - Shrdi

5
视图的投影阴影可以通过更改视图的轮廓提供程序来进行翻译、缩放或在x和y方向上进行更多操作,详细信息请参见此帖子

8
你介意用代码展示你的答案而不是发布链接到别人的帖子来演示吗?请提供你的代码,而不是其他参考资源的链接。 - glagarto
请勿发布仅包含资源链接而不包括相关内容的答案。 - Shadow

-2
就我所知,你不能自己更改阴影。在Android的Material Design中,阴影是由元素抬升的数量自动确定的。
根据这个问题https://graphicdesign.stackexchange.com/questions/80644/where-are-the-light-sources-located-in-material-design,光源位于

海拔45度,角度90度

你真的不应该使用不同的阴影,因为它会破坏Material Design的整体一致性。唯一需要做的就是提高你的元素。也许你应该重新阅读Material Design Guidlines: https://material.io/guidelines/material-design/environment.html#environment-light-shadow

13
这个回答是不正确的,你只是表达了你的观点,并没有给出任何回应。我不明白是不能改变光源位置还是你反对改变光源位置。 - xanexpt
这个问题涉及到android:elevation和材料设计指南规定,您不应该自行更改阴影以匹配整体风格。如果您仍然想这样做,最好不要使用android:elevation,而是创建自己的投影效果。 - xxtesaxx
好的,谢谢,但我仍然不明白是否可以更改3D“位置”或“光源”的本地阴影是否是“假”的。https://material.io/guidelines/resources/shadows.html - xanexpt
1
“光源”的“位置”是固定的,只能由谷歌更改。阴影实际上是简单的投影阴影,而不是一些带有真实光源的花哨的3D渲染。每个高度级别具有略微不同的值,以便在提高高度级别时看起来像某物会靠近观察者。现实情况是仅修改阴影的扩散和强度。没有任何东西真正被移动。如果您需要更改“光源”的“方向”,则应实现自己的投影阴影以匹配您的“光源”风格。 - xxtesaxx
1
那是不正确的,你可以通过改变轮廓提供者在任何地方放置阴影。将轮廓提供者向上偏移,阴影就会向上移动。阴影只是在视图之前绘制的一层,为什么你会说你不能改变它呢? - Mihai
OP在哪里说他遵循Material Design了?他只是说他想改变高程阴影的方向 - 这意味着他正在实现不同的设计语言。 - Tom

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