Android Material 组件 BottomNavigation 顶部阴影放在底部时与放在中心时不同

Android Material Component BottomNavigation top shadow different when placed at bottom than when in center

我正在尝试向我的导航栏添加更多高度,当我更改导航栏在 layout_gravity 中心的高度时,它会像我期望的那样产生阴影,但是当我将它锚定到底部时高度被覆盖或阴影被重置。

布局:

<?xml version="1.0" encoding="utf-8"?>
<androidx.coordinatorlayout.widget.CoordinatorLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:tools="http://schemas.android.com/tools"
        xmlns:app="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        tools:context=".MainActivity">


    <com.google.android.material.bottomnavigation.BottomNavigationView
            android:id="@+id/bottom_navigation"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:layout_gravity="bottom"
            app:elevation="48dp"
            android:background="@android:color/background_light"
            app:itemIconTint="@android:color/primary_text_light"
            app:itemTextColor="@android:color/primary_text_light"
            app:menu="@menu/navbar_menu" />

</androidx.coordinatorlayout.widget.CoordinatorLayout>

外观示例:

不是阴影被覆盖或重置,而是Material设计中对阴影的误解。

在 Material 设计中,您在更改视图的高度时看到的阴影实际上是根据阴影在现实世界对象中的显示方式计算的。

实际上,阴影并非无处不在。相反,当有光源照射到物体时,它们就会出现。如果您查看此 link,您会看到 Google 提到 Material 设计中的阴影是由 两个 虚拟光源创建的.一个光源称为 主光源 ,另一个光源称为 环境光

主光通过让虚拟光从屏幕顶部向下照射,创建更锐利和更有方向性的阴影,这通常在视图底部更深更暗的阴影中看到。

环境光通过让它的虚拟光从屏幕中心向下照射,在视图周围创建更柔和的阴影。这就是为什么您仍然会在视图的顶部看到较浅的阴影。这是因为不仅有一个光源从顶部照射,而且还有一个光源从屏幕中央照射。

这是光源的图像 look:

然而,就光源而言,仅此而已。屏幕底部没有光源照射,所以当您的 BottomNavigationView 放在底部时,您只会在 BottomNavigationView 的顶部边缘看到一个非常细微的阴影。一道影子,淡淡的,几乎不存在。这被认为是正常的。

当您将 BottomNavigationView 移动到屏幕中央时,您现在将其放置得更靠近其他两个光源,因此,您会得到更明显的阴影。

Google 确实警告不要故意向视图添加更深的阴影,因为这实际上会使布局看起来不自然。换句话说,它并没有模仿现实中的真实阴影。所以,不要故意尝试向 BottomNavigationView 添加更深的顶部阴影,因为考虑到其他视图的自然阴影时,它看起来会很奇怪。

您可能会争辩说您想要放置从屏幕底部发光的第三个光源,但不要忘记这也会对屏幕上的所有其他视图产生直接影响。想象一下在每个视图的顶部和底部都有一个更深的阴影……它不像当前的实现那样令人愉快或自然,只有底部有一个更深的阴影。

此外,请记住 Material 设计中的阴影是基于两个虚拟光源创建的。因此,不要假设 Elevation 是影响阴影显示方式的唯一元素。视图的大小、高度、在屏幕上的位置以及可能的其他因素都可能决定阴影如何出现在视图中。

底线是,不要试图在元素上强加阴影,因为阴影更丰富可能看起来更漂亮。这可能会导致它看起来不自然,这与 Material 设计背道而驰,一些用户可以接受这一点。