67

有没有办法在android(Honeycomb)中定义ViewGroup的剪辑区域?例如,我有一个带有圆角图像背景的 ListView。当我滚动浏览列表时,孩子们会伸出背景的角落——我希望他们夹在圆角内。 左:未剪裁,右:剪裁

左图是它当前正在做的,右图是我想要的。

我在看ClipDrawable,但似乎这只能用于进度条?

另外,我正在尝试在小部件中执行此操作。所以我不能使用自定义视图并覆盖 onDraw 进行屏蔽。

谢谢!

4

9 回答 9

26

尝试子类化 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() 覆盖中指定的边界,并且将根据您的“圆形”可绘制对象添加背景。

于 2015-01-29T03:30:55.543 回答
22

确保layout有带圆角的背景。

科特林

layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true

爪哇

layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);
于 2019-01-15T16:09:23.843 回答
6

创建自定义布局overridden onDraw(Canvas canvas)

称呼canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);

这将剪辑所有超出布局边界的视图。

并且不要忘记调用setWillNotDraw(false)构造函数,所以你的 onDraw 将执行

于 2013-11-27T10:32:14.970 回答
1

这个怎么样:如何将 Android 视图渲染为位图,然后剪辑该位图。

或者,另一个想法,使用FrameLayout,将您的剪辑蒙版堆叠在您的 ViewGroup 之上。剪辑蒙版将具有透明的中间、不透明的边框。

在这两种情况下,我想处理用户输入都会很棘手......

于 2011-05-24T19:41:33.940 回答
1
Path p = new Path()

// define your clipping path...

canvas.clipPath(p);
于 2012-03-26T18:23:16.700 回答
1

如果您查看WhatsUp,您会看到在联系人图片中,有一个被圆形边框环绕的图像。为此,我将 ImageView 放在具有圆角边框的 FrameLayout(FrameLayout 因为我在图片前面使用 ProgressBar 来通知加载[实际上不可见])中。图片是方形的,但要对其进行细化,您需要使用画布。

再看一下这个链接,它将解决您的问题;)

于 2012-04-10T23:03:59.190 回答
0

可能您可以使用 Canvas.clipRegion 方法来剪辑视图的差异。

于 2011-08-23T05:28:10.497 回答
0

要添加@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)
            }
        }
    }
}

在此处输入图像描述

于 2021-07-01T04:50:20.260 回答
-4

试试 android:clipToPadding。它会解决你的问题。

于 2012-04-10T07:50:38.743 回答