3

画面の x 座標と y 座標を、画面上での描画に使用される座標に変えようとしています。

したがって、タッチリスナーによって起動される MotionEvent から画面の X 座標と Y 座標を取得します。

それらにキャンバスに描画するために使用されるマトリックスを掛けるのと同じくらい簡単だと思ったので、ビューの作成時にマトリックスインスタンスを作成しました

matrix = new Matrix();

void onDraw(Canvas canvas)呼び出されると、キャンバスのマトリックスをコンストラクターで作成したマトリックスに設定し、すべての変換をマトリックスに適用します

matrix.reset();
canvas.setMatrix(matrix);
canvas.translate(getWidth() / 2, getHeight() / 2);
canvas.scale(mScaleFactor, mScaleFactor);
canvas.translate(-getWidth() / 2, -getHeight() / 2);
canvas.translate(-x, -y);

ビューは本来のように見えますが、タッチリスナーでスクリーン座標を回転させて、与えられた値を使用してそのマトリックスの座標を表示しようとすると、mapPoints(float[] points)正しくないため、onDraw で 0, 0 にクロスを描画します

canvas.drawLine(0f, -100f, 0f, 100f, viewportPaint);
canvas.drawLine(-100f, 0f, 100, 0f, viewportPaint);

スケーリング後に表示される場所をクリックすると、受け取った値は0、0に近くありません

float[] array = new float[]{e.getX(), e.getY()};
matrix.mapPoints(array);

Log.v(TAG, "points transformed are " + array[0] + ", " + array[1]);

明らかに 0, 0 マークをクリックしているこの写真を撮ったとき、次のログを受け取りました。

03-09 14:08:48.803: V/XXXX(22181): points transformed are 403.43967, 628.47

ここに画像の説明を入力 Ps。onDraw コード以外の場所でマトリックスに触れていません

4

2 に答える 2

2

これは他の人を助けるかもしれません:

onDraw() で

canvasMatrix.postScale(mScaleFactor, mScaleFactor);
canvasMatrix.postTranslate(-getWidth() / 2, -getHeight() / 2);
canvas.setMatrix(canvasMatrix);

マップされた座標が必要な他の場所:

  Matrix m = new Matrix();
  canvasMatrix.invert(m);

  float[] touch = new float[] { X, Y };
  m.mapPoints(touch);

  X = touch[0];
  Y = touch[1];

どうぞ。

于 2014-02-10T08:46:23.083 に答える
2

私は頭の中で質問を反転させました.質問を中断した後(8時間後..)、もう一度質問について考えたとき、私はそれを理解しました。この操作を実行するには、行列を反転する必要がありました。

また、キャンバスを変換しているときにマトリックスが変換されなかったため、canvas.get(matrix) を使用する必要がありました

キャンバスが使用していたのと同じマトリックスを取得するために..

于 2013-03-09T20:49:14.030 に答える