Face au même problème et solution de travail. Je vais d'abord l'expliquer et ensuite coller la méthode de conversion.
Le problème
coordonnées que vous voulez avoir est scène qui coordonne pertinentes sur votre scène commencent point (0,0) (dans mon cas en bas à gauche comme pour AndEngine anchorCenter) et les limites de (0,0) à [Camera.getSurfaceWidth(), Camera.getSurfaceHeight()].
coordonnées que vous obtenez de MotionEvent est écran les coordonnées avec des limites de (0,0) à [displayMetrix.widthPixels, displayMetrix.heightPixels] et ils sont toujours peu importe constante de zoom ou un appareil photo à la position scène .
explication Solution
Pour abscisse (en général x) calcul vous devrez traduire écran corrdinates à la scène pertinentes coordonnées (limitée avec une largeur de caméra) et l'ajouter à la caméra position de coin gauche sur la scène. Dans la formule, il ressemble à:
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
Pour ordonnée (en général y), vous devez faire la même chose que pour abscisse mais rappelez-vous qu'il est (surtout) a une mauvaise orientation. Ainsi, la formule sera un peu changé:
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
exemple de mise en œuvre de la méthode
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;
}
Je l'ai fait, voir la question. Le problème était que les coordonnées spécifiaient le point touché sur l'écran du téléphone, pas la scène. TouchEvent traduit les coordonnées de l'écran en coordonnées de scène, je cherchais une méthode qui ferait ça pour moi. – JohnEye