Android中的Canvas.rotate()问题。它是否真的有效?

时间:2012-05-24 08:35:09

标签: android graphics canvas 2d

请在下面找到我的onDraw方法的代码(。我试图在绘制弧后将画布旋转(//旋转调用-b)25度。但是我发现弧仍然是从0到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

        }
}

但是如果我在绘制弧之前放置旋转调用(//旋转调用-a),我会看到绘制的弧线移动了25度以上。这里究竟发生了什么?有人可以向我解释一下吗?

由于

1 个答案:

答案 0 :(得分:4)

Canvas维护一个Matrix,负责对其进行所有转换。即使是轮换。正如您在documentation中看到的那样,rotate方法说明了:

Preconcat the current matrix with the specified rotation.

所有转换都在Canvas Matrix上完成,因此在Canvas上完成。您绘制的弧不会旋转。首先旋转Canvas,然后在上面绘制。

因此,在您的代码中,call -a有效,而不是call -b

编辑: 对于postrotate和prerotate等问题,请检查Matrix类(postRotatepreRotate方法。)

几个示例:thisthis

您可能想要阅读的内容很少:thisthis