在缩放后获取点击的(x,y)坐标

时间:2013-06-19 21:27:42

标签: android touch android-custom-view zooming panning

我有一个自定义视图,它本质上是绘制在画布上的网格,我已经实现了平移和缩放。这些工作正常,但我也希望能够找到点击的网格坐标。

为了做到这一点,我必须补偿视图被平移的数量,以及它被缩放/缩放的数量。这就是我遇到的麻烦。

为了弥补它被淘汰的数量,我会跟踪PointF dspl中发生的所有翻译(或位移)。在我的自定义视图的onTouchEvent(MotionEvent event)方法中,我打开event.getAction() & MotionEvent.ACTION_MASK,在MotionEvent.ACTION_DOWN的情况下设置事件的起点以及起始位移和其他一些自解释的内容:< / p>

case MotionEvent.ACTION_DOWN:
    //Remember where we started

    start.set(event.getX(), event.getY());   //set starting point of event
    last.set(event.getX(),event.getY());     //set coordinates of last point touched
    startDspl.set(dspl.x,dspl.y);            //set starting displacement to current displacement

    //save the id of this pointer
    activePointerId = event.getPointerId(0);

    savedMatrix.set(matrix);                 //save the current matrix
    mode = DRAG;

    break;

然后在MotionEvent.ACTION_UP的情况下,我执行以下操作:

 case MotionEvent.ACTION_UP:
   mode = NONE;
   activePointerId = INVALID_POINTER_ID;

   distance = Math.sqrt( (start.x - last.x)*(start.x - last.x) + 
                         (start.y - last.y)*(start.y - last.y));

   if( distance < 5){
        //need to translate x and y due to panning and zooming

        int [] coord = getClickCoordinates(start.x,start.y);
        Toast.makeText(context, " x = " + coord[0] + ", y = " + coord[1], 
        Toast.LENGTH_SHORT).show();
    }

最后是获取坐标的方法:

public int[] getClickCoordinates(float clickX, float clickY) {

    float x = (clickX - startDspl.x)/(cellWidth*scaleFactor);
    float y = nRows - (clickY - startDspl.y)/(cellHeight*scaleFactor);

    return new int[] { (int) x, (int) y };
}

(此处scaleFactor是视图整体缩放的数量)。这种方法不适用于平移,正如我预期的那样,而且我不知道如何修改它以正确地考虑缩放。

我非常感谢任何帮助,因为我已经在很长一段时间内一直在努力解决这个问题,是的,我知道this问题,这与我想做的事情有点不同。 / p>

谢谢!

1 个答案:

答案 0 :(得分:0)

here回答了这个问题。它是一个类似问题的一部分。