我有一個自定義視圖,它本質上是一個繪製到畫布上的網格,爲此我已實現平移和縮放。這些工作正常,但我也希望能夠找到點擊的網格座標。獲取發生縮放後的點擊座標(x,y)
爲了做到這一點,我必須補償視圖被平移的數量以及它被放大/縮放的數量。這是我遇到的麻煩。
爲了彌補它已被平移的數量我跟蹤發生在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
是視圖總體縮放的量)。這種方法不適用於平移,正如我預期的那樣,而且我也不知道如何修改它以適當考慮縮放。
我非常感謝任何幫助,因爲我一直在爲此奮鬥很長一段時間,是的,我知道this問題,這與我想要做的有點不同。
謝謝!