ActivityView 的剪辑内容
Clip content of ActivityView
我正在 Android 中实现自定义启动器,使用 ActivityView 显示第 3 方应用程序。
我想将这些 ActivityView 的内容裁剪成自定义形状(除了 Circle、Rectangle、RoundedRectangle、Ring...)。
我已经尝试在父视图组元素的 dispatchDraw
canvas 上调用 clipPath
/drawPath
,该元素适用于除 ActivityView 之外的所有子元素。甚至 ActivityView 本身及其引用的 SurfaceView 似乎都根据我给定的路径进行了裁剪(如果我添加纯色进行测试)。但呈现的内容保持不变。操纵 SurfaceView canvas(您通过调用 getHolder().lockCanvas()
收到)也没有任何效果。
我认为这与 ActivityView 使用的虚拟显示 and/or 各种 SurfaceControls 有关,但我不知道如何为那些 类 设置裁剪 areas/paths ].
有人知道如何解决这个问题吗?
提示:我无法在 ActivityViews 内容上绘画,因为我想在透明区域显示系统壁纸。
最终正确设置 PorterDuffXfermode 解决了这个问题。只需覆盖父视图组的 dispatchDraw 方法并使用 PorterDuff 擦除所需区域即可。
有时,drawPath 路径的创建方式(CW 或 CCW)看起来方向很重要。所以也许两者都试试。
不幸的是,如果托管 activity 单独使用 SurfaceView,则此方法不起作用。
protected void dispatchDraw(Canvas canvas) {
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(getContext().getColor(android.R.color.white));
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
int save = canvas.save();
super.dispatchDraw(canvas);
canvas.drawPath(path, p);
canvas.restoreToCount(save);
}
我正在 Android 中实现自定义启动器,使用 ActivityView 显示第 3 方应用程序。 我想将这些 ActivityView 的内容裁剪成自定义形状(除了 Circle、Rectangle、RoundedRectangle、Ring...)。
我已经尝试在父视图组元素的 dispatchDraw
canvas 上调用 clipPath
/drawPath
,该元素适用于除 ActivityView 之外的所有子元素。甚至 ActivityView 本身及其引用的 SurfaceView 似乎都根据我给定的路径进行了裁剪(如果我添加纯色进行测试)。但呈现的内容保持不变。操纵 SurfaceView canvas(您通过调用 getHolder().lockCanvas()
收到)也没有任何效果。
我认为这与 ActivityView 使用的虚拟显示 and/or 各种 SurfaceControls 有关,但我不知道如何为那些 类 设置裁剪 areas/paths ].
有人知道如何解决这个问题吗?
提示:我无法在 ActivityViews 内容上绘画,因为我想在透明区域显示系统壁纸。
最终正确设置 PorterDuffXfermode 解决了这个问题。只需覆盖父视图组的 dispatchDraw 方法并使用 PorterDuff 擦除所需区域即可。
有时,drawPath 路径的创建方式(CW 或 CCW)看起来方向很重要。所以也许两者都试试。
不幸的是,如果托管 activity 单独使用 SurfaceView,则此方法不起作用。
protected void dispatchDraw(Canvas canvas) {
Paint p = new Paint(Paint.ANTI_ALIAS_FLAG);
p.setColor(getContext().getColor(android.R.color.white));
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
int save = canvas.save();
super.dispatchDraw(canvas);
canvas.drawPath(path, p);
canvas.restoreToCount(save);
}