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