需求
-
将View裁剪为指定形状
-
将Layout裁剪为指定形状,并且Children不能超过裁剪范围
应用
- 圆角图片
- 异形图片
- 圆角Layout
方案
通过ViewOutlineProvider裁剪控件范围
实现
fun View.getMeasureSize(): Size {val widthSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)val heightSpec = View.MeasureSpec.makeMeasureSpec(0, View.MeasureSpec.UNSPECIFIED)measure(widthSpec, heightSpec)return Size(measuredWidth, measuredHeight)
}fun View.clipToRoundRect(cornerRadius: Number) {outlineProvider = object : ViewOutlineProvider() {override fun getOutline(view: View, outline: Outline) {val measuredSize = view.getMeasureSize()outline.setRoundRect(0, 0, measuredSize.width, measuredSize.height, cornerRadius.toFloat())}}setClipToOutline(true)if (this is ViewGroup) {clipChildren = true}
}