转换矩阵仅适用于一种形状

时间:2012-09-12 16:42:08

标签: java android android-canvas

晚上好。

我正在尝试使用setRotation -method在画布上旋转一条线并且它完美地工作,除非您想在同一画布上绘制另一个形状。在使用Canvas的concat -method之后,整个画布将被逆时针/顺时针旋转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);
}

2 个答案:

答案 0 :(得分: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();

答案 1 :(得分: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)的新坐标。