多CardView阴影显示异常求助:底部CardView阴影被截断
看起来你遇到了CardView阴影在底部被截断的常见布局问题,我结合你的代码帮你分析原因并给出可行的解决方案:
问题根源
CardView的阴影是绘制在自身边界之外的,如果父容器开启了裁剪子View内容的属性,或者没有给阴影预留足够的显示空间,就会出现阴影被截断的情况。结合你的布局来看,NestedScrollView和内部嵌套的RelativeLayout是主要的问题诱因。
具体解决方案
1. 关闭父容器的内容裁剪属性
在你的NestedScrollView和内部根RelativeLayout中添加以下属性,禁止父容器裁剪子View超出边界的内容(比如CardView的阴影):
android:clipChildren="false" android:clipToPadding="false"
修改后的根布局示例:
<android.support.v4.widget.NestedScrollView xmlns:android="http://schemas.android.com/apk/res/android" xmlns:app="http://schemas.android.com/apk/res-auto" android:layout_width="match_parent" android:layout_height="match_parent" android:background="@color/white" app:layout_behavior="@string/appbar_scrolling_view_behavior" android:clipChildren="false" android:clipToPadding="false"> <RelativeLayout android:layout_width="match_parent" android:layout_height="match_parent" android:fillViewport="true" android:clipChildren="false" android:clipToPadding="false"> <!-- 子布局内容 --> </RelativeLayout> </android.support.v4.widget.NestedScrollView>
2. 给CardView添加兼容padding
在所有出现阴影问题的CardView中添加cardUseCompatPadding="true"属性,它会自动为CardView适配不同Android版本的padding值,确保阴影有足够的显示空间:
<android.support.v7.widget.CardView android:id="@+id/weather" android:layout_width="0dp" android:layout_height="250dp" android:layout_margin="10dp" android:layout_weight="0.8" app:cardBackgroundColor="@color/white" app:cardElevation="10dp" app:cardUseCompatPadding="true"> <!-- CardView内部内容 --> </android.support.v7.widget.CardView>
3. 调整布局间距的设置方式
把CardView的android:layout_margin="10dp"替换为父容器的padding,比如给包裹CardView的LinearLayout添加android:padding="10dp",然后将CardView的margin设为0。这样父容器会直接为阴影预留空间,避免被自身边界截断。
4. 简化布局层级
你当前NestedScrollView嵌套RelativeLayout再嵌套LinearLayout的结构,容易导致绘制范围计算异常。可以尝试将根RelativeLayout替换为垂直方向的LinearLayout,减少嵌套层级:
<android.support.v4.widget.NestedScrollView ...> <LinearLayout android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="vertical" android:clipChildren="false" android:clipToPadding="false"> <!-- 轮播图布局 --> <RelativeLayout android:id="@+id/banners" android:layout_width="match_parent" android:layout_height="@dimen/banner_height"> <!-- 轮播图内容 --> </RelativeLayout> <!-- 挑战CardView --> <android.support.v7.widget.CardView android:id="@+id/challenges" ...> <!-- CardView内容 --> </android.support.v7.widget.CardView> <!-- 内容LinearLayout --> <LinearLayout android:id="@+id/body" ...> <!-- 天气CardView等内容 --> </LinearLayout> </LinearLayout> </android.support.v4.widget.NestedScrollView>
额外提醒
注意你的XML代码末尾没有闭合CardView和其他标签,记得补全闭合标签,避免布局解析错误。
内容的提问来源于stack exchange,提问作者Dale Julian

