2012-04-27 64 views
1

我正在開發一個在AndEngine中使用多點觸摸的應用程序。爲了獲得觸摸手指的座標,我使用pSceneTouchEvent.getMotionEvent().getX([pointer index]),因爲TouchEvent沒有等價的獲取器,只有pSceneTouchEvent.getX()MotionEvent座標到場景座標

問題是MotionEvent在屏幕上返回座標,而TouchEvent在場景上返回座標。當我放大或縮小時,屏幕和場景座標不匹配,所以我需要將屏幕座標轉換爲場景座標。我怎樣才能做到這一點?

回答

0

找到解決方案。 Andengine以與Android不同的方式處理觸摸事件,因此不存在觸摸座標的歷史記錄。我只是我自己保存他們的私有變量處理事件之前:

if (pSceneTouchEvent.getPointerID() == 0) { 
    pointer0LastX = pSceneTouchEvent.getX(); 
    pointer0LastY = pSceneTouchEvent.getY(); 
} 
if (pSceneTouchEvent.getPointerID() == 1) { 
    pointer1LastX = pSceneTouchEvent.getX(); 
    pointer1LastY = pSceneTouchEvent.getY(); 
} 

然後我訪問的這些,而不是從使用TouchEvent得到的值。

0

您可以從TouchEvent訪問原始MotionEvent。

+0

我這樣做,看到問題。問題在於座標指定了手機屏幕上的觸摸點,而不是場景。 TouchEvent將屏幕座標轉換爲場景座標,我正在尋找一種方法可以爲我做到這一點。 – JohnEye 2012-04-30 09:20:19

1

面對同樣的問題並解決了一些問題。首先我將解釋它,然後將粘貼轉換方法。

的問題,你想擁有

座標場景座標其相關的場景開始(0,0)點(在我的情況左下角爲AndEngine anchorCenter)和界限從( 0,0)改爲[Camera.getSurfaceWidth(),Camera.getSurfaceHeight()]。

座標從MotionEvent得到的是屏幕座標與界限從(0,0)到[displayMetrix.widthPixels,displayMetrix.heightPixels]而且他們總是恆定不進行變焦或相機對場景位置的事情。

解決方案的解釋

對於橫座標(一般X)計算,你將需要屏幕corrdinates轉化爲相關現場協調(帶攝像頭的寬度爲界),並把它添加到相機在場景左上角的位置。式,它看起來像:

x = cameraStartX + screenX * camera.width/display.width 

cameraStartX - camera left corner x position on the scene 
screenX - x you get from MotionEvent 
camera.width - just getWidth() from your camera method 
display.width - display width from DisplayMetrics 

對於座標(一般Ÿ),你必須做同樣爲橫座標,但請記住,這是(最重要的),有錯誤的方向。因此,公式會有點改變:

y = cameraStartY+(display.heigth-screenY)*camera.height/display.heigth 

cameraStartY - camera left corner y position on the scene 
screenX - y you get from MotionEvent 
camera.height - just getHeight() from your camera method 
display.height - display height from DisplayMetrics 

方法實現的例子

public static void convertScreenToSurfaceCoordinates(
     final Camera camera, 
     final Context context, 
     final float[] screenCoordinates, 
     final float[] surfaceCoordinates) { 
    //you may want to have separate method and fields for display metrics 
    //and no Context as a method param 
    WindowManager windowManager = (WindowManager) context.getSystemService(Context.WINDOW_SERVICE); 
    Display display = windowManager.getDefaultDisplay(); 
    DisplayMetrics metrics = new DisplayMetrics(); 
    display.getMetrics(metrics); 
    float displayWidth = Math.max(metrics.widthPixels, metrics.heightPixels); 
    loat displayHeight = Math.min(metrics.widthPixels, metrics.heightPixels); 

    //abscissa 
    surfaceCoordinates[Constants.VERTEX_INDEX_X] = camera.getXMin() 
      + screenCoordinates[Constants.VERTEX_INDEX_X] * camera.getWidth() 
      /displayWidth; 
    //ordinate 
    surfaceCoordinates[Constants.VERTEX_INDEX_Y] = camera.getYMin() 
      + (displayHeight - screenCoordinates[Constants.VERTEX_INDEX_Y]) 
      * camera.getHeight()/displayHeight; 
}