5

キャンバスに2つの文字列を描画する必要があります。文字列は同じ座標で描画する必要があり、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);

上記の3つのコードすべてについて、結果は次のようになります。

ここに画像の説明を入力してください

2番目のテキストが範囲外または後ろに描画されているため、表示されていないと思い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 に答える