Android中CardView圆角被子视图覆盖问题求助
我之前踩过一模一样的坑!明明在Lollipop及以上版本,CardView的圆角能完美裁切子视图,结果到了4.4.2的设备上,子视图直接把圆角给盖住了,太影响视觉效果了。
问题根源
这其实是Android版本兼容性的问题:Android 5.0(API 21)才引入了ViewOutlineProvider机制,CardView在高版本靠这个实现了对子视图的圆角裁切;但在KitKat这类低版本系统里,CardView是通过添加带圆角的阴影背景来模拟圆角效果的,没法自动裁切超出圆角范围的子视图内容。
可行解决方案
给你三个亲测有效的解决办法,按需选择:
方法一:开启CardView的裁切属性
在布局文件的CardView标签里加上android:clipChildren="true"和android:clipToPadding="true",强制CardView把超出自身圆角区域的子视图内容裁切掉:<androidx.cardview.widget.CardView android:layout_width="match_parent" android:layout_height="wrap_content" app:cardCornerRadius="16dp" android:clipChildren="true" android:clipToPadding="true"> <!-- 你的子视图,比如LinearLayout、ImageView之类的 --> </androidx.cardview.widget.CardView>方法二:给子视图同步设置圆角
如果方法一没生效,可以给CardView的直接子布局也设置和CardView相同的圆角,让子视图本身就带着圆角,自然不会覆盖CardView的圆角:
比如给内部的LinearLayout设置圆角背景:<LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:background="@drawable/rounded_corner_bg">然后在
res/drawable下创建rounded_corner_bg.xml:<shape xmlns:android="http://schemas.android.com/apk/res/android"> <solid android:color="#FFFFFF"/> <!-- 和子视图背景色一致 --> <corners android:radius="16dp"/> <!-- 和CardView的cardCornerRadius保持相同 --> </shape>如果子视图是ImageView,建议用
RoundedBitmapDrawable来处理图片圆角,避免图片边缘超出CardView。方法三:关闭CardView的内边距适配(谨慎使用)
调用cardView.setPreventCornerOverlap(false)可以关闭CardView为适配低版本阴影而添加的内边距,但这样可能会导致阴影和子视图重叠,适合不需要阴影的场景:CardView cardView = findViewById(R.id.your_card_view); cardView.setPreventCornerOverlap(false);
内容的提问来源于stack exchange,提问作者BDC

