Android查看剪辑

时间:2011-04-06 23:33:45

标签: java android xml android-layout clip

有没有办法在android(Honeycomb)中定义ViewGroup的剪辑区域?例如,我有一个带有圆角的图像背景的ListView。当我滚动列表时,孩子们伸出背景的角落 - 我宁愿他们在圆角内剪辑。 Left: unclipped, Right: clipped

左图是目前正在做的,右边是我想要的。

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

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

谢谢!

9 个答案:

答案 0 :(得分:23)

尝试继承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);
}

...并且还创建一个像这样的自定义drawable,称为' rounded',替换为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()覆盖中指定的边界,并且会根据您的&#39;舍入&#39;添加背景。绘制。

答案 1 :(得分:5)

使用overridden onDraw(Canvas canvas)

创建自定义布局

致电canvas.clipRect(0, 0, mCanvasWidth, mCanvasHeight);

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

不要忘记在构造函数中调用setWillNotDraw(false),这样你的onDraw就会执行

答案 2 :(得分:4)

确保layout的背景带有圆角。

科特林

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

Java

layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);

答案 3 :(得分:1)

如何:How to render an Android view to a bitmap,然后剪切该位图。

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

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

答案 4 :(得分:1)

Path p = new Path()

// define your clipping path...

canvas.clipPath(p);

答案 5 :(得分:1)

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

再看看这个可以解决问题的link;)

答案 6 :(得分:0)

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

答案 7 :(得分: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)
            }
        }
    }
}

enter image description here

答案 8 :(得分:-1)

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