【问题标题】:Issue with Canvas.rotate() in Android .How does it exactly work?Android 中的 Canvas.rotate() 问题。它究竟是如何工作的?
【发布时间】:2012-05-24 08:35:09
【问题描述】:

请在下面找到我的 onDraw 方法的代码(。我正在尝试将画布(//Rotate call -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

        }
}

但是,如果我在绘制圆弧之前放置旋转调用(//Rotate call -a),我会看到绘制的圆弧移动了 25 度以上。这里到底发生了什么?谁能给我解释一下?

谢谢

【问题讨论】:

    标签: android graphics canvas 2d


    【解决方案1】:

    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

    【讨论】:

    • 感谢您的回答。但是即使我在绘制弧线后调用它,旋转也会应用于矩阵。所以不应该旋转整个弧线。我在这里错过了什么。如果可能你能指导我参考画布绘图吗?(已经阅读了android开发者网站)
    猜你喜欢
    • 1970-01-01
    • 2015-02-26
    • 2020-05-16
    • 2014-04-30
    • 1970-01-01
    • 1970-01-01
    • 2023-03-22
    • 1970-01-01
    • 2020-06-04
    相关资源
    最近更新 更多