2

晚上好。

我正在尝试使用 setRotation -方法在画布上旋转一条线,并且效果很好,除非您想在同一画布上绘制另一个形状。使用 Canvas 的 concat 方法后,整个画布将被旋转,比如说,逆时针/顺时针旋转 30 度。这就是问题所在。我只想旋转线条,不想旋转此画布或整个画布上的任何其他形状。我发现位图可以用矩阵来绘制,但是看起来很麻烦和笨拙。另外,有人建议为 Canvas 设置一个新矩阵,事实上,这个提议也不管用。

所以,这个问题听起来很简单,如何在不使用 OpenGl 的情况下旋转画布上唯一的一个形状并影响画布上的其他形状?

提前感谢您的回答!

这是带有注释和其他内容的代码:

@Override
public void onDraw(Canvas canvas)
{
    int startX, startY, stopX, stopY;
    startY = stopY = 100;
    startX = 100;
    stopX = 200;
    this.paint = new Paint();
    //this.path = new Path();
    this.matrix = canvas.getMatrix();
    this.paint.setColor(Color.BLUE);
    this.paint.setStrokeWidth(4);

    this.matrix.setRotate(180, startX, startY);
    canvas.concat(this.matrix);
    /*this.matrix.setTranslate(startX, 0);
    canvas.concat(this.matrix);*/

    canvas.drawLine(startX, startY, stopX, stopY, this.paint);

    canvas.setMatrix(new Matrix());
    //canvas.drawCircle(200, 200, 50, paint);
}
4

2 回答 2

3

你可以试试Canvas.save()这个Canvas.restore()。他们应该将当前矩阵放入堆栈,一旦完成修改后的矩阵,您就可以返回到前一个矩阵。

this.matrix.setRotate(180, startX, startY);
canvas.save();
canvas.concat(this.matrix);
canvas.drawLine(startX, startY, stopX, stopY, this.paint);
canvas.restore();
于 2012-09-12T16:52:22.293 回答
1

Mozoboy 提出了使用线性代数的想法。这是使用线性代数并保持在 Android API 范围内的 onDraw(Canvas canvas) 方法的新代码:

    Matrix m = new Matrix();       //Declaring a new matrix
    float[] vecs = {7, 3};    //Declaring an end-point of the line

   /*Declaring the initial values of the matrix 
     according to the theory of the 3 
     dimensional chicken in 2D space 
    There is also 4D chicken in 3D space*/

    float[] initial = {1, 0, 0, 0, 1, 0, 0, 0, 1};    
    m.setValues(initial);   
    float[] tmp = new float[9];    //Debug array of floats
    m.setRotate(90, 4.0f, 3.0f);    //Rotating by 90 degrees around the (4, 3) point
/*Mapping our vector to the matrix. 
  Similar to the multiplication of two
  matrices 3x3 by 1x3. 
  In our case they are (matrix m after rotating) multiplied by      
  (7)
  (3)
  (1) according to the theory*/ 

  m.mapPoints(vecs);             

    for(float n : vecs)
    {
        Log.d("VECS", "" + n);     //Some debug info
    }

    m.getValues(tmp);
    for(float n : tmp)
    {
        Log.d("TMP", "" + n);      //also debug info
    }

作为该算法的结果,我们得到了线终点的新坐标 (4, 6)。

于 2012-09-13T17:02:31.263 回答