MaterialCardView被子View覆盖区域阴影消失问题求助
我来帮你搞定这个问题!你遇到的情况其实是Android View层级和阴影绘制的逻辑在起作用:
当紫色子View完全盖住MaterialCardView的部分区域时,它的不透明背景直接挡住了卡片在该区域下方的阴影。至于你给子View加的elevation没效果,是因为子View是卡片的子元素——它的阴影会绘制在卡片的上方(子View的z轴位置比卡片更高),而不是卡片阴影所在的下方区域,所以自然看不到它的阴影和卡片阴影叠加。
给你两种实用的解决方案,按需选就行:
方案1:把紫色View和卡片设为同级元素
把紫色View从MaterialCardView里移出来,让它和卡片一起成为ConstraintLayout的直接子View,再用约束让它和卡片的对应位置对齐。这样两者的阴影会分开绘制:卡片的阴影在最底层,紫色View的阴影在卡片阴影上面,而且紫色View的背景不会挡住卡片的阴影(因为卡片阴影在紫色View的下方区域)。
修改后的布局代码是这样的:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <!-- Elevation of this card is large for demonstration purposes --> <com.google.android.material.card.MaterialCardView android:id="@+id/card_view" android:layout_width="match_parent" android:layout_height="90dp" android:layout_margin="16dp" app:cardElevation="24dp" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"/> <View android:layout_width="120dp" android:layout_height="match_parent" android:background="@color/purple_500" android:elevation="24dp" app:layout_constraintBottom_toBottomOf="@id/card_view" app:layout_constraintStart_toStartOf="@id/card_view" app:layout_constraintTop_toTopOf="@id/card_view" /> </androidx.constraintlayout.widget.ConstraintLayout>
方案2:让子View继承卡片的阴影(关闭卡片阴影,给子View加阴影)
如果你希望紫色View的阴影和卡片整体阴影看起来一致,可以关掉MaterialCardView的阴影,然后给紫色View和卡片剩下的区域都加上阴影。不过这种方法得调整布局结构,比如用横向LinearLayout包裹紫色View和一个白色空白View,让两者都有阴影:
<?xml version="1.0" encoding="utf-8"?> <androidx.constraintlayout.widget.ConstraintLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent" android:layout_height="match_parent" tools:context=".MainActivity"> <LinearLayout android:layout_width="match_parent" android:layout_height="90dp" android:layout_margin="16dp" android:orientation="horizontal" app:layout_constraintEnd_toEndOf="parent" app:layout_constraintStart_toStartOf="parent" app:layout_constraintTop_toTopOf="parent"> <View android:layout_width="120dp" android:layout_height="match_parent" android:background="@color/purple_500" android:elevation="24dp"/> <View android:layout_width="0dp" android:layout_height="match_parent" android:layout_weight="1" android:background="@color/white" android:elevation="24dp"/> </LinearLayout> </androidx.constraintlayout.widget.ConstraintLayout>
要是你想保留MaterialCardView的圆角、波纹这些特性,可以把LinearLayout里的两个View换成MaterialCardView就行。
额外说一句:如果你的需求是让紫色View看起来就是卡片的一部分,同时保留卡片的整体阴影,方案1肯定是更好的选择——它既保留了MaterialCardView的所有特性,又能让两者的阴影正常显示。
内容的提问来源于stack exchange,提问作者Max Rudko

