我通过渲染路径来绘制地球。地球的边缘非常锋利,我想柔化边缘,使其更具视觉吸引力。
为了表现,我不会删除隐藏线。我只是计算路径上的每个点是否可见(用户正在查看的地球的一侧)并将路径绘制到最近的角落。为了隐藏它,我在整个视图上绘制了一个位图,然后打了一个洞来查看地球。
为了柔化边缘,我正在尝试创建一个具有径向渐变透明度的环。此方法创建掩码:
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,我总是得到一个坚固的戒指(或没有戒指),就像在这个例子中,戒指从边缘偏移并涂成红色,这样我就可以看到发生了什么上。
关于如何使这项工作的任何想法?
答案 0 :(得分:1)
我认为问题在于你如何设置颜色。
颜色成分是(α,R,G,B),每一个都是0到255 所以当你写0xFFFF0000时。 alpha值设置透明度。 所以当你将alpha设置为FF时,这意味着它是完全不透明的,而00是完全透明的。 所以尝试更改alpha值..也许像0x70FF0000
答案 1 :(得分:1)
我找到了一个更好的解决方案,最终得到了一个更小,更快的方法,它完全符合我的要求。什么不喜欢?
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);
Canvas maskCanvas = new Canvas(mask);
maskCanvas.drawColor(Color.BLACK);
maskPaint.setMaskFilter(new BlurMaskFilter(30, BlurMaskFilter.Blur.INNER));
maskCanvas.drawCircle(kHorizontalOffset, this.getHeight() - kVerticalOffset, (float) radius, maskPaint);
}
关键是BlurMaskFilter应用于绘画以模糊其用于绘制的任何区域的内部,在本例中为圆形。它只是我正在寻找的微妙效果: