0

以下の私の onDraw メソッドのコードを見つけてください(。弧を描いた後、キャンバスを回転させようとしています(//Rotate call -b)。しかし、弧はまだ0から50度まで描かれています。私はそれがさらに25度動くことを期待していました。

public class CustomView extends View {

    public CustomView(Context context) {
        super(context);

    }

    public CustomView(Context context, AttributeSet attrs) {
        super(context, attrs);

    }
    protected void onDraw(Canvas canvas) {
            super.onDraw(canvas);

            Paint paint = new Paint();
            paint.setColor(Color.RED);
            int px = getMeasuredWidth() / 2;
            int py = getMeasuredHeight() / 2;

            // radius - min 
            int radius = 130;

            // Defining bounds for the oval for the arc to be drawn
            int left = px - radius;
            int top = py - radius;
            int right = left + (radius * 2);
            int bottom = top + (radius * 2);

            RectF rectF = new RectF(left, top, right, bottom);
            paint.setColor(Color.RED);
            paint.setStyle(Style.FILL);

                //canvas.rotate(25,px,py);//Rotate call -a

        canvas.drawArc(rectF, 0, 50, true, paint);

            canvas.rotate(25,px,py);//Rotate call  -b

        }
}

しかし、円弧を描く前に回転呼び出し (//Rotate call -a) を配置すると、描かれた円弧がさらに 25 度ずれていることがわかります。誰かが私に説明できますか?

ありがとう

4

1 に答える 1

4

は、そのすべての変換を担当する をCanvas維持します。Matrixローテーションにも。documentationでわかるように、rotateメソッドは次のように述べています。

Preconcat the current matrix with the specified rotation.

すべての変換は で行われるCanvas Matrixため、 で行われCanvasます。描いた弧は回転しません。最初に を回転させてCanvasから描画します。

したがって、あなたのコードでcall -aは、ではなく動作しますcall -b

編集: postrotate や prerotate などの問題については、Matrixクラス (postRotateおよびpreRotateメソッド) を確認してください。

いくつかの例: thisおよびthis

そして、あなたが読みたいかもしれないいくつかのこと:これこれ.

于 2012-05-24T08:54:24.017 に答える