21

キャンバスの描画操作を弧状のくさびにクリップしようとしています。ただし、クリッピングパスをキャンバスに設定した後、意図した結果が得られません。

説明のために、これが私がやっていることです:

ここに画像の説明を入力

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。ここで何が起こっているのか、何か考えはありますか?

編集更新として、ハードウェアアクセラレーションを可能にする、これを行うはるかに効率的な方法を見つけました。まず、(クリッピングする) イメージ全体をオフスクリーン ビットマップに描画します。BitmapShaderthis を使用して を作成し、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
    );
}
4

2 に答える 2

3

OPの質問は、特にクリッピング領域の使用に関するもので、@Simonによって回答されています。ただし、塗りつぶされた円弧を描くより簡単な方法があることに注意してください。

を作成しますPaint

mPaint = new Paint();
mPaint.setColor(Color.BLUE);
mPaint.setStyle(Style.FILL);
mPaint.setAntiAlias(true);

描画するときは、単純にパスを描画します:

canvas.drawPath(path, mPaint);
于 2013-09-05T15:56:26.313 に答える