パスをレンダリングして地球を描いています。球体のエッジは非常にシャープなので、視覚的に魅力的にするためにエッジを柔らかくしたいと考えています。
パフォーマンスのために、隠線除去は行っていません。パス上の各ポイントが表示されるかどうか (ユーザーが表示している地球の側面) を計算し、パスを最も近い隅に描画します。これを隠すために、ビュー全体にビットマップを描画し、穴を開けて地球を表示します。
エッジを柔らかくするために、放射状のグラデーション透明度を持つリングを作成しようとしています。このメソッドはマスクを作成します。
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 に関係なく、この例のように常にソリッド リング (またはリングなし) が得られることです。リングはエッジからオフセットされ、何が起こっているかを確認できるように赤く着色されています。
これを機能させる方法についてのアイデアはありますか?