キャンバスの描画操作を弧状のくさびにクリップしようとしています。ただし、クリッピングパスをキャンバスに設定した後、意図した結果が得られません。
説明のために、これが私がやっていることです:
path.reset();
//Move to point #1
path.moveTo(rect.centerX(), rect.centerY());
//Per the documentation, this will draw a connecting line from the current
//position to the starting position of the arc (at 0 degrees), add the arc
//and my current position now lies at #2.
path.arcTo(rect, 0, -30);
//This should then close the path, finishing back at the center point (#3)
path.close();
これは機能し、単純にこのパス ( canvas.drawPath(path, paint)
) を描画すると、上記のようにくさびが描画されます。ただし、このパスをキャンバスのクリッピング パスとして設定して描画すると、次のようになります。
//I've tried it with and without the Region.Op parameter
canvas.clipPath(path, Region.Op.REPLACE);
canvas.drawColor(Color.BLUE);
代わりに次の結果が得られます (くさびは参照を示すためだけに残されています)。
Path
そのため、代わりに、それ自体ではなく、の境界四角形にクリップしているように見えますPath
。ここで何が起こっているのか、何か考えはありますか?
編集更新として、ハードウェアアクセラレーションを可能にする、これを行うはるかに効率的な方法を見つけました。まず、(クリッピングする) イメージ全体をオフスクリーン ビットマップに描画します。BitmapShader
this を使用して を作成し、Bitmap
そのシェーダーを に設定してから、そのオブジェクトPaint
を使用してウェッジ パスを描画します。Paint
drawMyBitmap(bitmap);
Shader shader = new BitmapShader(bitmap, Shader.TileMode.CLAMP, Shader.TileMode.CLAMP);
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setShader(shader);
@Override
public void onDraw(Canvas canvas) {
canvas.drawArc(rect, //The rectangle bounding the circle
startAngle, //The angle (CW from 3 o'clock) to start
sweepAngle, //The angle (CW from 3 o'clock) of the arc
true, //Boolean of whether to draw a filled arc (wedge)
paint //The paint with the shader attached
);
}