Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/311.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android视图剪辑_Java_Android_Xml_Android Layout_Clip - Fatal编程技术网

Java Android视图剪辑

Java Android视图剪辑,java,android,xml,android-layout,clip,Java,Android,Xml,Android Layout,Clip,有没有办法在android(蜂巢)中定义视图组的剪辑区域?例如,我有一个具有圆角的图像背景的列表视图。当我滚动浏览列表时,孩子们从背景的各个角落伸出来——我更喜欢他们夹在圆角内。 左边的图像是它目前正在做的,右边的是我想要的 我在看ClipDrawable,但它似乎只能用于进度条 另外,我正试图在一个小部件中实现这一点。因此,我无法使用自定义视图和覆盖onDraw进行遮罩 谢谢大家! 这个怎么样:,然后剪辑位图 或者,另一种方法是,使用FrameLayout,将剪辑遮罩堆叠在视图组的顶部。剪辑

有没有办法在android(蜂巢)中定义视图组的剪辑区域?例如,我有一个具有圆角的图像背景的列表视图。当我滚动浏览列表时,孩子们从背景的各个角落伸出来——我更喜欢他们夹在圆角内。

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

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

另外,我正试图在一个小部件中实现这一点。因此,我无法使用自定义视图和覆盖onDraw进行遮罩

谢谢大家!

这个怎么样:,然后剪辑位图

或者,另一种方法是,使用
FrameLayout
,将剪辑遮罩堆叠在视图组的顶部。剪辑遮罩将具有透明的中间不透明边框


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

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

尝试一下android:cliptoppadding。它将解决您的问题。

如果您仔细查看,您可以看到在联系人图片中有一个圆形边框的图像。
Path p = new Path()

// define your clipping path...

canvas.clipPath(p);
为此,我将ImageView放在一个边框为圆形的FrameLayout(FrameLayout,因为我在图片前面使用ProgressBar通知加载[实际上不可见])中。这幅画是正方形的,但要使它更精细,你需要使用画布


再看一看,这将解决您的问题;)

使用
覆盖的onDraw(画布)创建自定义布局

调用canvas.clipRect(0,0,mcavaswidth,mcavasheight)

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


不要忘了在构造函数中调用
setWillNotDraw(false)
,这样您的onDraw将执行尝试对ViewGroup进行子类化并覆盖onDraw方法,如下所示,用in值替换RADIUS(以像素为单位):

@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);
}
…还可以创建一个自定义的可绘制图形,称为“圆角”,用背景颜色和半径替换为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>

所有子项都将剪裁到您在OnDraw()覆盖中指定的边界,并且将根据您的“圆角”可绘制添加背景。

确保
布局
具有圆角背景

科特林

爪哇


第一个选项不起作用,因为它在一个小部件中,因此它只能使用与RemoteView兼容的视图。第二个选项,因为它是一个主屏幕小部件,剪辑掩码将不可行。永远不要在
onDraw
中实例化对象,这将导致延迟。最初的问题是要求使用RemoteView。注意:需要API级别21。您找到解决方案了吗?我还试图在一个小部件中实现这一点。
android:background="@drawable/rounded"
android:clipChildren="true"
layout.outlineProvider = ViewOutlineProvider.BACKGROUND
layout.clipToOutline = true
layout.setOutlineProvider(ViewOutlineProvider.BACKGROUND);
layout.setClipToOutline(true);