2013-06-19 97 views
1

我有一個自定義視圖,它本質上是一個繪製到畫布上的網格,爲此我已實現平移和縮放。這些工作正常,但我也希望能夠找到點擊的網格座標。獲取發生縮放後的點擊座標(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問題,這與我想要做的有點不同。

謝謝!

回答

0

這個問題被回答了here。它是作爲類似問題的一部分提出的。