1

我正在 AndEngine 中使用多点触控开发应用程序。为了获取我使用的触摸手指的坐标,pSceneTouchEvent.getMotionEvent().getX([pointer index])因为 TouchEvent 没有等效的 getter,只有pSceneTouchEvent.getX().

问题是 MotionEvent 返回屏幕上的坐标,而 TouchEvent 返回场景上的坐标。当我放大或缩小时,屏幕和场景坐标不匹配,所以我需要将屏幕坐标转换为场景坐标。我怎样才能做到这一点?

4

3 回答 3

1

面对同样的问题并有解决办法。首先我想解释一下,然后将转换方法粘贴。

问题

您想要的坐标是与您的场景起点 (0,0) 相关的场景坐标(即 AndEngine anchorCenter 位于左下角)。边界:从 (0,0) 到 [Camera.getSurfaceWidth(), Camera.getSurfaceHeight()]。

您从 MotionEvent 获得的坐标是屏幕坐标,范围从 (0,0) 到 [displayMetrix.widthPixels, displayMetrix.heightPixels],它们独立于缩放或相机到场景的位置。

解决方案说明

对于横坐标(通常为x),您必须将屏幕坐标转换为相关的场景坐标(以相机宽度为界)并将总和与相机左角位置(在场景中)相加。在公式中它看起来像:

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

cameraStartX - the 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),您必须对横坐标执行相同的操作,但请记住它具有不同的方向。所以公式会有所改变:

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 a separate methods 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;
}
于 2015-05-25T12:30:49.640 回答
0

找到解决方案。Andengine 以与 Android 不同的方式处理触摸事件,因此没有触摸坐标的历史记录。在处理事件之前,我只是将它们自己存储在私有变量中:

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

然后我只是访问这些而不是从 TouchEvent 中获取值。

于 2012-04-27T14:03:15.560 回答
0

您可以从 TouchEvent 访问原始 MotionEvent。

于 2012-04-27T15:59:48.243 回答