Android 中的 Canvas.rotate() 问题.它究竟是如何工作的



请在下面找到我的onDraw方法的代码(.我正在尝试在绘制弧线后将画布(//旋转调用 -b)旋转 25 度。但我发现弧线仍然是从 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 度。这里到底发生了什么?有人可以向我解释一下吗?

谢谢

Canvas维护一个负责其上所有转换的Matrix。即使是旋转。正如您在文档中看到的,rotate方法说:

Preconcat the current matrix with the specified rotation.

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

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

编辑:对于后旋转和预旋转等问题,请检查矩阵类(postRotatepreRotate方法)。

几个例子:这个和这个。

你可能想读的很少的东西:这个和这个。

相关内容

  • 没有找到相关文章

最新更新