晚上好。
我正在尝试使用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);
}
答案 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)的新坐标。