Android屏幕坐标到画布视图坐标

时间:2013-03-09 12:11:33

标签: java android matrix android-canvas

我正在尝试将屏幕x和y坐标转换为用于在屏幕上绘制的坐标。

所以我从触摸监听器触发的MotionEvent中获取我的屏幕X和Y坐标。

我认为它应该像用画布上绘制的矩阵那样容易,所以我在创建视图时创建了Matrix实例

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)查看该矩阵的坐标时,它给出的值不正确,我在0,0上绘制交叉在onDraw

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

enter image description here PS。我没有在我的onDraw代码

之外的任何地方接触矩阵

2 个答案:

答案 0 :(得分:2)

我脑子里的问题已经倒了,当我在休息之后再次考虑这个问题时(8小时后......)我得到了它,我必须反转矩阵才能执行此操作。 / p>

当我转换画布时,矩阵也没有被转换,所以我必须使用canvas.get(matrix)

以获得画布使用的相同矩阵..

答案 1 :(得分: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];
你去吧。