2011-07-28 27 views
9

Estoy capturando un MotionEvent para un clic largo en un Android SurfaceView usando un GestureListener. Entonces necesito traducir las coordenadas del MotionEvent a las coordenadas del lienzo, desde donde puedo generar coordenadas de mapa personalizadas (no Google Maps).¿Cómo traduzco correctamente las coordenadas de píxeles a las coordenadas del lienzo en Android?

De lo que he leído, me tomo la dada MotionEvent e, e.getX() y e.getY() get coordenadas de píxeles. ¿Cómo puedo convertir estas coordenadas a las coordenadas del lienzo SurfaceView?

Aquí es mi GestureListener para escuchar por los clics largos:

/** 
* Overrides touch gestures not handled by the default touch listener 
*/ 
private class GestureListener extends GestureDetector.SimpleOnGestureListener { 

    @Override 
    public void onLongPress(MotionEvent e) { 
    Point p = new Point(); 
    p.x = (int) e.getX(); 
    p.y = (int) e.getY(); 
    //TODO translate p to canvas coordinates 
    } 
} 

Gracias de antemano!

Editar: ¿Esto tiene que ver con el tamaño de la pantalla/resolución/profundidad y el lienzo 'Rect object?

+0

Did ha intentado traducir '(dx, flotador dy) '? –

+0

Lo investigué. Lamentablemente, no estoy dibujando en el lienzo. Necesito las coordenadas reales. Una vez que obtenga las coordenadas del lienzo, planeo traducir las coordenadas de mi lienzo a las coordenadas del mapa de la aplicación que se utilizarán para la navegación. – Phil

+0

¿Realmente nadie más? ¿Tiene esto que ver con el tamaño/resolución/profundidad de la pantalla y el lienzo 'Rect object? ¿Alguien ha hecho esta traducción antes? – Phil

Respuesta

0

Si entiendo correctamente, tiene un lienzo Vista dentro de la superficie. Si es así, intente VIEW.getLeft() | getTop() que devuelve la izquierda | posición superior de la vista relativa a su padre.

float x= e.getX() - canvasView.getLeft(); 
float y= e.getY() - canvasView.getTop(); 
+0

Gracias por la idea. Lo probé y todavía no funciona. – Phil

5

Bueno, usted tiene la pantalla de píxeles de la pantalla en x, y, y se puede llamar a la lona px través de:

Canvas c = new Canvas(); 
int cx = c.getWidth(); 
int cy = c.getHeight(); 
... 
Display display = getWindowManager().getDefaultDisplay(); 
int sx = display.getWidth(); 
int sy = display.getHeight(); 

A continuación, puede hacer los cálculos para mapear la pantalla táctil ver, con el px dado tanto en la vista como en la pantalla.

canvasCoordX = p.x*((float)cx/(float)sx); 
canvasCoordY = p.y*((float)cy/(float)sy); 

Consulte http://developer.android.com/reference/android/view/WindowManager.html para obtener más información sobre el administrador de pantalla. Creo que debe inicializarse dentro de una actividad para que funcione.

+0

gracias por la idea. Lo probé, pero todavía no funciona correctamente. – Phil

+0

¿cuál es el error? – Noah

+0

No hay ningún error. Proporciona alguna traducción, sin embargo, no es la traducción correcta. Está encontrando formas de coordenadas de lienzo en la parte superior de la pantalla, sin importar dónde presione. – Phil

8

Puede intentar usar los métodos MotionEvent.getRawX()/getRawY() en lugar del getX()/getY().

// get the surfaceView's location on screen 
int[] loc = new int[2]; 
surfaceView.getLocationOnScreen(loc); 
// calculate delta 
int left = e.getRawX()-loc[0]; 
int top = e.getRawY()-loc[1]; 
1

poco me encontré con este problema al hacer algo muy similar y después de un poco de ensayo y error y un montón de googlear Terminé la adaptación de esta respuesta (https://stackoverflow.com/a/9945896/1131180):

(e es un MotionEvent, por lo que la mejor lugar para utilizar el código estaría en onTouch o onLongPress)

mClickCoords = new float[2]; 

//e is the motionevent that contains the screen touch we 
//want to translate into a canvas coordinate 
mClickCoords[0] = e.getX(); 
mClickCoords[1] = e.getY(); 

Matrix matrix = new Matrix(); 
matrix.set(getMatrix()); 

//this is where you apply any translations/scaling/rotation etc. 
//Typically you want to apply the same adjustments that you apply 
//in your onDraw(). 

matrix.preTranslate(mVirtualX, mVirtualY); 
matrix.preScale(mScaleFactor, mScaleFactor, mPivotX, mPivotY); 

// invert the matrix, creating the mapping from screen 
//coordinates to canvas coordinates 
matrix.invert(matrix); 

//apply the mapping 
matrix.mapPoints(mClickCoords); 

//mClickCoords[0] is the canvas x coordinate and 
//mClickCoords[1] is the y coordinate. 

Hay algunas optimizaciones obvias que se pueden aplicar aquí pero creo que es más claro de esta manera.

0

si está utilizando el desplazamiento, a continuación, el real y en el lienzo es

float y = event.getY() + arg0.getScrollY(); 
Cuestiones relacionadas