0

だから私は次のコードで円を描いています

public void drawCircle(int radius, ImageView imageView)
{
    Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
    circlePaint.setStrokeWidth(1);
    circlePaint.setColor(Color.RED);
    circlePaint.setStyle(Paint.Style.FILL_AND_STROKE);
    circlePaint.setAntiAlias(true);

    Bitmap circleBitmap = Bitmap.createBitmap(radius*2, radius*2, Bitmap.Config.ARGB_4444);
    Canvas circleCanvas = new Canvas(circleBitmap);
    circleCanvas.drawCircle(radius, radius, radius, circlePaint);
    //canvas.drawColor(Color.WHITE); used on the picture to the right
    imageView.setImageBitmap(circleBitmap);
}

これにより、画面に次の円が描画されます
bitmap.width == radius*2 の円 白い背景に bitmap.width == radius*2 の円

ご覧のとおり、円の上下左右が少し切り取られています。ビットマップの背景色を白に設定すると、犯人が表示されます。描画される円は、ビットマップの幅と高さと同じ半径で、ビットマップよりわずかに大きくなります。

これが起こっていることを確認するために、同じサイズの円を描いてみましたが、ビットマップのサイズを約 5% 大きくし、円を中心に配置しました。これにより、次のことがわかりました。

bitmap.width = radius*2*1.05 の円 白い背景に bitmap.width == radius*2*1.05 の円

ご覧のとおり、これらの円には、前の円と同じカットオフがありません。

これは予想される動作ですか?サイズ x の適切な円を描画したい場合、常にサイズ > x のビットマップを作成し、円をその内側に正しく配置する必要がありますか?

4

1 に答える 1

1

それで、なぜこれが起こったのかを理解しました。実際には非常に単純です。
ストロークは、円の半径の外側に追加されます。したがって、Radius = 10pxおよびStroke = 2pxの円は、描画される半径が12px ですが、半径 10px の円と見なされます。

この場合、Paint プロパティを次のように設定するだけで修正できます。

Paint circlePaint = new Paint(Paint.ANTI_ALIAS_FLAG);
circlePaint.setColor(Color.RED);
circlePaint.setStyle(Paint.Style.FILL);
circlePaint.setAntiAlias(true);
于 2013-08-29T16:19:57.840 に答える