我有一个自定义视图,它本质上是一个绘制在画布上的网格,为此我实现了平移和缩放。这些工作正常,但我也希望能够找到点击的网格坐标。
为了做到这一点,我必须同时补偿视图被平移的量,以及它被缩放/缩放的量。这就是我遇到的麻烦。
为了补偿它被平移的数量,我跟踪所有发生在PointF dspl
. 在onTouchEvent(MotionEvent event)
我的自定义视图的方法中,我打开event.getAction() & MotionEvent.ACTION_MASK
并在这种情况下MotionEvent.ACTION_DOWN
设置事件的起点以及起始位移和其他一些不言自明的事情:
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
是视图整体缩放的量)。正如我预期的那样,此方法不适用于平移,而且我不知道如何修改它以正确考虑缩放。
我非常感谢任何帮助,因为我已经为此苦苦挣扎了很长时间,是的,我知道这个问题,这与我想做的有点不同。
谢谢!