我有同样的情况。我发现:
Docs for Top app bar specs说TopAppBar的container有一个角色“Surface”和Elevation(滚动)Level 2.
在页面Color system - Color roles我找到的资料是:
在高程 +2 组件与表面颜色容器接收原色覆盖 8% 的不透明度。
因此 TopAppBarLayout 的默认样式使用 ?attr/colorSurface 作为背景色和 ?attr/colorPrimary 具有 8% 的不透明度作为 overlay(一种稀松布效果)。
我的解决方案:
为 AppBarLayout 创建样式并将 android:outlineAmbientShadowColor 和 android:outlineSpotShadowColor 设置为黑色(因为它是创建阴影的默认颜色)。这些属性在Widget.Material3.AppBarLayout.
中设置为透明<style name="Widget.App.AppBarLayout" parent="Widget.Material3.AppBarLayout">
<item name="android:outlineAmbientShadowColor" ns1:ignore="NewApi">@android:color/black</item>
<item name="android:outlineSpotShadowColor" ns1:ignore="NewApi">@android:color/black</item>
</style>
除上述之外,您还可以添加带有颜色的 android:background 属性或将 colorSurface 设置为您的颜色(背景)并将 colorPrimary 设置为@android:transparent(覆盖)的 materialThemeOverlay 属性。我更喜欢直接添加 android:background 因为添加 materialThemeOverlay 会对 AppBarLayout 的子视图产生影响。
<style name="Widget.App.AppBarLayout" parent="Widget.Material3.AppBarLayout">
<item name="android:outlineAmbientShadowColor" ns1:ignore="NewApi">@android:color/black</item>
<item name="android:outlineSpotShadowColor" ns1:ignore="NewApi">@android:color/black</item>
<item name="android:background">@color/white</item>
</style>
或
<style name="Widget.App.AppBarLayout" parent="Widget.Material3.AppBarLayout">
<item name="android:outlineAmbientShadowColor" ns1:ignore="NewApi">@android:color/black</item>
<item name="android:outlineSpotShadowColor" ns1:ignore="NewApi">@android:color/black</item>
<item name="materialThemeOverlay">@style/ThemeOverlay.App.DayNight.NoActionBar</item>
</style>
<style name="ThemeOverlay.App.DayNight.NoActionBar" parent="Theme.Material3.DayNight.NoActionBar">
<item name="colorPrimary">@android:color/transparent</item>
<item name="colorSurface">@android:color/white</item>
</style>
不要忘记将您的样式应用于您的 AppBarLayout 或主题。
顺便说一下,liftOnScroll 属性在Widget.Material3.AppBarLayout 中设置为 true,因此无需设置它。一切都只为滚动视图设置layout_behavior。
您可以使用来自material docs
的主题的特殊属性<style name="AppTheme" parent="Theme.Material3.Light.NoActionBar">
<item name="elevationOverlayEnabled">false</item>
</style>