我正在通过渲染路径来绘制地球仪。地球的边缘非常锋利,我想柔化边缘以使其更具视觉吸引力。
为了性能,我不做隐藏线移除。我只是在计算路径上的每个点是否可见(用户正在查看的地球的一侧)并将路径绘制到最近的角落。为了隐藏这一点,我在整个视图上绘制了一个位图,然后打一个洞来查看地球。
为了柔化边缘,我正在尝试创建一个具有径向渐变透明度的环。此方法创建掩码:
private void createMask(int width, int height, double radius) {
if(radius==0){return;}
if (mask != null) {
mask.recycle();
}
mask = Bitmap.createBitmap(width, height, Bitmap.Config.ARGB_4444);
// create a RadialGradient
RadialGradient gradient = new android.graphics.RadialGradient(
kHorizontalOffset, kVerticalOffset,
30f, 0x00FF0000, 0xFFFF0000,
android.graphics.Shader.TileMode.CLAMP);
// TODO move to init()
Paint p = new Paint();
p.setShader(gradient);
//p.setColor(0xFF000000);
p.setColor(0xFFFF0000);
p.setStrokeWidth(20f);
p.setStrokeCap(Paint.Cap.ROUND);
p.setStyle(Paint.Style.STROKE);
p.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.DST_OVER));
Canvas maskCanvas = new Canvas(mask);
maskCanvas.drawColor(Color.BLACK);
final RectF rect = new RectF();
rect.set((float)(kHorizontalOffset - radius + 50), (float)(kVerticalOffset - radius + 50),
(float)(kHorizontalOffset + radius - 50), (float)(kVerticalOffset + radius - 50));
// draw transparent circle using the maskPaint
maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint);
// draw the radial gradient ring
maskCanvas.drawArc(rect, -90, 360, false, p);
}
我的问题是,无论我使用什么 PortDuff.Mode,我总是得到一个实心圆环(或没有圆环),如本例所示,圆环偏离边缘并涂成红色,这样我就可以看到发生了什么。
关于如何使这项工作的任何想法?