有没有办法在android(Honeycomb)中定义ViewGroup的剪辑区域?例如,我有一个带有圆角图像背景的 ListView。当我滚动浏览列表时,孩子们会伸出背景的角落——我希望他们夹在圆角内。
左图是它当前正在做的,右图是我想要的。
我在看ClipDrawable,但似乎这只能用于进度条?
另外,我正在尝试在小部件中执行此操作。所以我不能使用自定义视图并覆盖 onDraw 进行屏蔽。
谢谢!
有没有办法在android(Honeycomb)中定义ViewGroup的剪辑区域?例如,我有一个带有圆角图像背景的 ListView。当我滚动浏览列表时,孩子们会伸出背景的角落——我希望他们夹在圆角内。
左图是它当前正在做的,右图是我想要的。
我在看ClipDrawable,但似乎这只能用于进度条?
另外,我正在尝试在小部件中执行此操作。所以我不能使用自定义视图并覆盖 onDraw 进行屏蔽。
谢谢!
尝试子类化 ViewGroup 并覆盖 OnDraw 方法,如下所示,替换为 RADIUS_IN_PIXELS 的值:
@Override
protected void onDraw(Canvas canvas) {
Path clipPath = new Path();
clipPath.addRoundRect(new RectF(canvas.getClipBounds()), RADIUS_IN_PIXELS, RADIUS_IN_PIXELS, Path.Direction.CW);
canvas.clipPath(clipPath);
super.onDraw(canvas);
}
...并创建一个像这样的自定义可绘制对象,称为“圆形”,替换为 YOUR_BACKGROUND_COLOR 和 RADIUS_IN_DP,确保将 DP 中矩形的四舍五入与您之前在 PX 中的剪切半径相匹配:
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android">
<corners android:radius="RADIUS_IN_DP" />
<solid android:color="YOUR_BACKGROUND_COLOR"/>
</shape>
然后您可以在布局中使用该子类,添加行
android:background="@drawable/rounded"
android:clipChildren="true"
所有子项都将剪辑到您在 OnDraw() 覆盖中指定的边界,并且将根据您的“圆形”可绘制对象添加背景。
确保layout
有带圆角的背景。
科特林
layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true
爪哇
layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);
创建自定义布局overridden onDraw(Canvas canvas)
称呼canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);
这将剪辑所有超出布局边界的视图。
并且不要忘记调用setWillNotDraw(false)
构造函数,所以你的 onDraw 将执行
这个怎么样:如何将 Android 视图渲染为位图,然后剪辑该位图。
或者,另一个想法,使用FrameLayout
,将您的剪辑蒙版堆叠在您的 ViewGroup 之上。剪辑蒙版将具有透明的中间、不透明的边框。
在这两种情况下,我想处理用户输入都会很棘手......
Path p = new Path()
// define your clipping path...
canvas.clipPath(p);
可能您可以使用 Canvas.clipRegion 方法来剪辑视图的差异。
要添加@Marco 的答案,您还可以提供自定义的View.outlineProvider
. 我在使用 Google 的新版本时遇到了类似的问题MaterialCardView
。出于某种原因,该视图不会用圆角剪裁其子视图。子视图只会绘制在圆角的顶部。
科特林:
val cornerRadius = 16.dp()
materialCardView.apply {
clipToOutline = true
outlineProvider = object : ViewOutlineProvider() {
override fun getOutline(view: View?, outline: Outline?) {
view?.apply {
outline?.setRoundRect(0, 0, width, (height + cornerRadius).toInt(), cornerRadius)
}
}
}
}
试试 android:clipToPadding。它会解决你的问题。