web-dev-qa-db-ja.com

Canvas.clipPath(Path)が期待どおりにクリッピングしない

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

説明のために、ここに私がやっていることがあります:

enter image description here

_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);
_

代わりに次の結果が得られます(参照を示すためだけにウェッジが残されています)。

enter image description here

したがって、代わりに、Path自体ではなく、Pathの境界の四角形にクリップしているように見えます。ここで何が起こっているのか考えはありますか?

[〜#〜] edit [〜#〜]更新と同じように、ハードウェアアクセラレーションを可能にする、はるかに効率的な方法を見つけました。まず、画像全体(クリッピングする)をオフスクリーンビットマップに描画します。このBitmapShaderを使用して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
    );
}
_
21
Kevin Coppock

HC以上を使用していますか、それともハードウェアアクセラレーションを使用していますか?

その場合、clipPathはサポートされておらず、問題があります。

developer.Android.com/guide/topics/graphics/hardware-accel.html

13
Simon

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

Paintを作成します:

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

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

canvas.drawPath(path, mPaint);
3
Paul Lammertsma