0

SVG描画用のJavaコードがあります。rotateChromeでのレンダリングと比較して、多数のテスト画像で確認できる限り、を含む変換を処理し、これを非常にうまく実行します。次に必要なのは、実際のオブジェクトの場所を取得することです。これは、変換によって宣言された多くの画像に含まれています。そこで、描画に使用したMatrixからXとYを読み取ることにしました。残念ながら、rotate変換の値が正しくありません。つまり、画像内の実際のオブジェクトの場所に対応していません。

削除されたコードは次のようになります。

Matrix matrix = new Matrix();
float cx = 1000;    // suppose this is an object X coordinate
float cy = 300;     // this is its Y coordinate
float angle = -90;  // rotate counterclockwise, got from "rotate(-90, 1000, 300)"

// shift to -X,-Y, so object is in the center
matrix.postTranslate(-cx, -cy);
// rotate actually
matrix.postRotate(angle);
// shift back
matrix.postTranslate(cx, cy);
// debug goes here
float[] values = new float[9];
matrix.getValues(values);
Log.v("HELLO", values[Matrix.MTRANS_X] + " " + values[Matrix.MTRANS_Y]);

ログはそれぞれ700と1300の値を出力します。画像内でオブジェクトが所定の位置で回転しているのがわかり(つまり、動きがないため)、0と0が予想されます。また、postTranslate呼び出しは相互に補正する必要があります。もちろん、これらの値が1000と300からどのように形成されるかはわかりますが、その理由はわかりません。繰り返しになりますが、これらの奇妙な値を持つ行列が実際のオブジェクトの描画に使用されており、正しく見えることを指摘します。誰かがここで何が起こっているのか説明できますか?私は何かが足りないのですか?これまでのところ、私の問題の解決策は1つだけです。から位置を取得しようとせrotateず、明示的matrixおよびtranslate変換に対してのみ実行してください。しかし、このアプローチには一般性が欠けており、とにかく、マトリックスはどの変換タイプに対しても妥当な値(オフセットを含む)を持つべきだと思いました。

4

1 に答える 1

0

答えは、マトリックスは空間変換の演算子であり、オブジェクトの位置を直接抽出するために使用すべきではないということです。代わりに、SVG タグのxおよび属性で指定されているように、初期オブジェクト座標を取得し、それらに行列を適用する必要があります。y

float[] src = new float[2];
src[0] = cx;
src[1] = cy;
matrix.mapPoints(src);

この後、x 変数と y 変数で適切な位置の値を取得します。

于 2012-07-02T12:54:26.930 に答える