final int saveCount = canvas.save();
// Clip out a circle.
circle.reset();
circle.addCircle(cx, cy, radius, Path.Direction.CW);
circle.close();
canvas.clipPath(circle, Region.Op.DIFFERENCE);
// Draw the rectangle color.
canvas.drawColor(backColor);
canvas.restoreToCount(saveCount);
// Create a new canvas.
final Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
final Canvas c = new Canvas(b);
// Draw the rectangle colour.
c.drawColor(backColor);
// Erase a circle.
c.drawCircle(cx, cy, radius, eraser);
// Draw the bitmap on our views canvas.
canvas.drawBitmap(b, 0, 0, null);
eraser = new Paint()
eraser.setColor(0xFFFFFFFF);
eraser.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));
canvas.drawColor(backColor);
canvas.drawCircle(cx, cy, radius, eraser);
与HW加速兼容方法相同,但不需要额外的画布。但这有一个主要问题--它在强制使用SW渲染的情况下工作,但在HTC One X(Android 4.0.4--可能还有其他一些设备)上,至少在启用HW渲染的情况下,它会让圆圈完全变黑。这很可能与22361有关。
方法4:HW加速(可接受,适用于所有设备)
根据Jan关于改进方法2的建议,我避免在每次调用ondraw
时创建位图,而是在onsizechanged
中创建位图:
if (w != oldw || h != oldh) {
b = Bitmap.createBitmap(w, h, Bitmap.Config.ARGB_8888);
c = new Canvas(b);
}
if (overlayBitmap == null) {
b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
c = new Canvas(b);
}
b.eraseColor(Color.TRANSPARENT);
c.drawColor(backColor);
c.drawCircle(cx, cy, radius, eraser);
canvas.drawBitmap(b, 0, 0, null);
您应该能够分配一次新的画布,而不是在每次重新绘制时分配一个新的画布,然后在每次重新绘制时重用该画布。
在初始化和调整大小时:
Bitmap b = Bitmap.createBitmap(getWidth(), getHeight(), Bitmap.Config.ARGB_8888);
Canvas c = new Canvas(b);
重绘时:
b.eraseColor(Color.TRANSPARENT);
// needed if backColor is not opaque; thanks @JosephEarl
c.drawColor(backColor);
c.drawCircle(cx, cy, radius, eraser);
canvas.drawBitmap(b, 0, 0, null);
我们可以用2*1的小矩形横着或者竖着去覆盖更大的矩形。请问用n个2*1的小矩形无重叠地覆盖一个2*n的大矩形,总共有多少种方法? 第2*n个矩形的覆盖方法等于第2*(n-1)加上第2*(n-2)的方法。 f = lambda n: 1 if n < 2 else f(n - 1) + f(n - 2)
题目链接 NowCoder 题目描述 我们可以用 2*1 的小矩形横着或者竖着去覆盖更大的矩形。请问用 n 个 2*1 的小矩形无重叠地覆盖一个 2*n 的大矩形,总共有多少种方法? 解题思路 当 n 为 1 时,只有一种覆盖方法: 当 n 为 2 时,有两种覆盖方法: 要覆盖 2*n 的大矩形,可以先覆盖 2*1 的矩形,再覆盖 2*(n-1) 的矩形;或者先覆盖 2*2 的矩形,再覆盖 2*(
问题内容: 我想在UIView的阴影层中“切出一个洞”,Swift3,iOS 我有一个容器(UIView),有2个子容器: 一个UIImageView 该图像上方有一个UIView(“叠加层”) 我想给覆盖了一层阴影,并切出阴影的内矩形,创建一个辉光像在ImageView的边缘效果 ,这是至关重要的辉光插图,由于图像拍摄屏幕宽度 我的代码至今: 现在的结果如下所示: 现在,我想剪掉较暗的内部部分,
我想把一个颜色覆盖(蓝色,红色或绿色或十六进制值)在一个视频给它一个Instagram滤镜一样的效果。 我认为应该是这样的: 也可以使用 但我发现一个错误: 我还尝试使用,但这并没有给它一个红色(它把红色去掉了)。 我做错了什么?
尽管标题听起来很复杂,但我的实际问题应该不太难建模。但是,我无法找到一个好的算法来执行以下操作: 我想用固定数量的n个矩形覆盖网格上的一组正方形。这些矩形可能会重叠,它们只需要覆盖我的形状的外边缘。 平方米x平方米网格上不同矩形的数量为: 因此,蛮力方法必须尝试的组合数量是 对于10 x 10网格和仅3个矩形,这将是2768064625个组合。 带有一些正方形的初始网格可能如下所示: n = 1:
假设我有一个视频和一个图像(碰巧包含一个alpha通道)。我可以像这样在视频上混合这个图像: (为了可读性,这里使用了多行,通常这是一个命令行)。 有没有一种方法可以添加一个自定义的整体不透明度或透明度混合因子,比如或其他什么,这会使图像只有50%的可见性?