5

我必须在画布上绘制 2 个字符串。字符串必须使用相同的坐标绘制,第二个字符串必须是第一个字符串绕 Y 轴旋转 45 度的结果。结果必须如下所示:

在此处输入图像描述

这是我的代码:

Matrix matrix = new Matrix();
matrix = canvas.getMatrix();
mCamera = new Camera();


canvas.drawText("In the name of God", 30, 100, redPaint);
mCamera.rotateY(45);
mCamera.getMatrix(matrix);

matrix.preTranslate(30, 100);
//      matrix.postTranslate(-30, -100);

canvas.setMatrix(matrix);
canvas.drawText("In the name of God", 0, 0, greenPaint);

但是上面代码的结果是:

在此处输入图像描述

你可以看到字符串的坐标是不同的。那么我做错了什么?我猜这是由不正确的参数引起的matrix.preTranslate()

更新

我将代码更改为:

canvas.drawText("In the name of God", 30, 100, redPaint);
mCamera.rotateY(45);
mCamera.getMatrix(matrix);
matrix.preTranslate(-30, -100);
matrix.postTranslate(30, 100);
canvas.setMatrix(matrix);
canvas.drawText("In the name of God", 0, 0, greenPaint);

或喜欢:

canvas.drawText("In the name of God", 30, 100, redPaint);
mCamera.rotateY(45);
mCamera.getMatrix(matrix);
matrix.preTranslate(-30, -100);
//matrix.postTranslate(30, 100);
canvas.setMatrix(matrix);
canvas.drawText("In the name of God", 0, 0, greenPaint);

或喜欢:

canvas.drawText("In the name of God", 30, 100, redPaint);
mCamera.rotateY(45);
mCamera.getMatrix(matrix);

matrix.preTranslate(-30, -100);
//      matrix.postTranslate(30, 100);
canvas.setMatrix(matrix);
canvas.drawText("In the name of God", 30, 100, greenPaint);

对于上述所有三个代码,结果如下所示:

在此处输入图像描述

我猜第二个文本超出了范围或在后面status bar,所以它是不可见的。

然后将我的代码更改为:

mCamera.rotateY(45);
mCamera.getMatrix(matrix);
matrix.preTranslate(-30, -100);
matrix.postTranslate(30, 100);
canvas.setMatrix(matrix);
canvas.drawText("In the name of God", 30, 100, greenPaint);

结果:

在此处输入图像描述

4

3 回答 3

3

感谢您的回复。我解决了这个问题。我必须使用canvas.concat()而不是。canvas.setMatrix这是正确的代码:

Matrix matrix = new Matrix();
mCamera = new Camera();

canvas.drawText("In the name of God", 30, 100, redPaint);
mCamera.rotateY(60);
mCamera.getMatrix(matrix);

matrix.preTranslate(-30, -100);
matrix.postTranslate(30, 100);
canvas.concat(matrix);
canvas.drawText("In the name of God", 30, 100, greenPaint);
于 2012-11-19T06:52:49.400 回答
2

试试这个:

Matrix matrix = new Matrix();
matrix = canvas.getMatrix();
mCamera = new Camera();


canvas.drawText("In the name of God", 30, 100, redPaint);
mCamera.translate(30, 100);
mCamera.rotateY(45);
mCamera.getMatrix(matrix);

canvas.setMatrix(matrix);
canvas.drawText("In the name of God", 0, 0, greenPaint);

我从不搞乱前翻译和后翻译,但你可以调试它并尝试做后翻译而不是预翻译并提供 (30, 100) 看看是否有效。

于 2012-11-18T14:28:40.413 回答
1

矩阵对象描述的旋转始终具有其旋转轴通过原点的属性。旋转轴上的每个点在旋转下都是不变的,这是一种奇特(且紧凑)的说法,即它不会改变。按照您描述所需结果的方式,您希望文本的左边缘不移动。这意味着文本的左边缘必须在那个不变的轴上。

这是pretranslate()为了什么。您需要将文本位置转换为原点的翻译。该平移的坐标是坐标的负数:

matrix.preTranslate(-30, -100);

此平移应用于文本,而不是旋转轴。这种混乱似乎是你问题的根源。要将文本放回原来的位置,postTranslate请与预翻译的负数一起使用,即与原始坐标一起使用。

为了更好地理解这一点,请阅读相似变换

于 2012-11-18T15:46:32.233 回答