如何在Android画布上对剪辑边界进行抗锯齿处理?

Jes*_*son 30 android android-widget

我正在使用Android的android.graphics.Canvas来绘制一个环.我的onDraw方法剪切画布为内圈创建一个洞,然后在洞上绘制整个外圈:

    clip = new Path();
    clip.addRect(outerCircle, Path.Direction.CW);
    clip.addOval(innerCircle, Path.Direction.CCW);

    canvas.save();
    canvas.clipPath(clip);
    canvas.drawOval(outerCircle, lightGrey);
    canvas.restore();
Run Code Online (Sandbox Code Playgroud)

结果是一个带有漂亮,抗锯齿外边缘和锯齿状,丑陋内边缘的戒指:

别名

我能做些什么来消除内缘?

我不想通过在中间画一个灰色圆圈来欺骗,因为对话框略微透明.(这种透明度在其他背景上并不那么微妙.)

Rom*_*rik 20

AFAIK,你不能解决剪辑区域.

我建议使用位图屏蔽.将粉色,白色和浅灰色前景渲染为一个位图,将外/内圆遮罩(灰度alpha通道)Paint.setXfermode渲染到另一个位图,然后使用以遮罩作为其Alpha通道渲染前景位图.

可以在ApiDemos这里的源代码中找到一个示例:


编辑:为了更好的衡量,这里是API演示中该活动的屏幕截图,说明了屏蔽:

Xfermodes截图http://nikonizer.yfrog.com/Himg46/scaled.php?tn=0&server=46&filename=xfermodes.png&xsize=640&ysize=640

  • 请注意,打开硬件加速时,Xfermode在某些设备上无法正常工作.考虑使用`setLayerType(LAYER_TYPE_SOFTWARE,null)`进行查看. (2认同)
  • @RomanNurik这仍然是最好的解决方案吗? (2认同)

HRJ*_*HRJ 5

我知道这不是一个通用的答案,但在这种特殊情况下,您可以绘制具有粗笔画宽度的圆弧,而不是圆 + 蒙版。