RecyclerView设置圆角背景后子项滚动超出圆角区域如何解决?
方案1:使用系统自带裁剪能力(最简方案,适配Android 5.0+)
这个方案不需要自定义View,只需要给RecyclerView加两行代码即可生效,依赖你已经设置好的圆角背景drawable:
// Kotlin 代码 rv.outlineProvider = ViewOutlineProvider.BACKGROUND rv.clipToOutline = true
// Java 代码 rv.setOutlineProvider(ViewOutlineProvider.BACKGROUND); rv.setClipToOutline(true);
注意:如果你的圆角背景是设置在RecyclerView的父布局上,需要把上述配置加在父布局上才能生效,该方案仅支持矩形、圆角、圆形的常规裁剪,不支持不规则形状。
方案2:自定义RecyclerView实现裁剪(兼容全版本,支持自定义规则)
如果需要兼容Android 5.0以下版本,或者有自定义裁剪形状的需求,可以重写RecyclerView的绘制逻辑实现裁剪:
class RoundedRecyclerView @JvmOverloads constructor( context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0 ) : RecyclerView(context, attrs, defStyleAttr) { private val clipPath = Path() private val rectF = RectF() // 可自定义为xml属性读取圆角大小 private val radius = resources.getDimension(R.dimen.your_rounded_radius) override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) { super.onSizeChanged(w, h, oldw, oldh) rectF.set(0f, 0f, w.toFloat(), h.toFloat()) clipPath.reset() clipPath.addRoundRect(rectF, radius, radius, Path.Direction.CW) } override fun dispatchDraw(canvas: Canvas) { canvas.save() canvas.clipPath(clipPath) super.dispatchDraw(canvas) canvas.restore() } }
之后把布局里的androidx.recyclerview.widget.RecyclerView替换为你自定义的RoundedRecyclerView即可。
方案3:实现边缘渐隐效果
如果不需要硬裁剪,想要更柔和的渐隐过渡效果,可以直接开启RecyclerView的边缘褪色属性:
在布局的RecyclerView节点添加如下属性:
android:fadingEdge="vertical" android:fadingEdgeLength="@dimen/fade_edge_length" android:requiresFadingEdge="vertical"
也可以在代码中动态配置褪色长度,适配不同的圆角大小。
内容的提问来源于stack exchange,提问作者joghm
相关产品推荐
相关产品推荐

