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

问题描述:

我想将我的屏幕x和y坐标转换为用于在屏幕上绘制的坐标。Android屏幕坐标到画布视图坐标

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

我认为这应该是作为乘以那些这是我们用来在画布上绘制的矩阵一样容易,所以我creatad 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); 

的观点看来,它应该,但是当我触摸监听我试图把我的屏幕坐标图与矩阵U坐标唱mapPoints(float[] points)它提供了不正确的价值观,我的onDraw

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

借鉴0跨,0,当我点击它似乎是缩放后,什么不是我收到值不差得远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代码

我有我的想法倒在脑后,当我想了解一个问题后休息一下(8小时后)我知道了,我知道了必须颠倒矩阵才能执行此操作。

此外,当我正在改变画布,所以我不得不canvas.get(矩阵)

为了得到该画是使用相同的矩阵

矩阵并没有改变..

这可能帮助别人:

在的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]; 

你走了。