Cómo convertir un GeoPoint en un punto de pantalla Hardware

Me gustaría convertir un GeoPoint a un punto de pantalla para identificar todos los objetos que están por encima de un evento táctil. Por lo tanto, he intentado esto:

Projection projection = this.mapView.getProjection(); GeoPoint gie = new GeoPoint(lat, lon); Point po = new Point(); projection.toPixels(gie, po); 

Pero, po.x y po.y no son los coords de pantalla, pero el mapview coords en píxeles en lugar de lat, lon.

Desde el sitio web para desarrolladores de Android:

ToPixels (GeoPoint in, android.graphics.Point out) Convierte el GeoPoint dado a las coordenadas de píxeles en pantalla, en relación con la parte superior izquierda del MapView que proporcionó esta Proyección.

Por lo tanto, es posible convertirlo en la pantalla correcta coords?

Quiero saber todos los x GeoPoint que están al lado del evento + touch como en el ejemplo anterior:

 ---------------------------------------------------------------- (0,0) -----------> x | | | | | | | <-- My screen | + (touch event) | \/ x (my GeoPoint) | y | | ---------------------------------------------------------------- 

Tengo el evento táctil como ese:

 @Override public boolean onTouchEvent(MotionEvent event) { float x = event.getX(); float y = event.getY(); 

Aquí, en este código, xey son las coordenadas reales de la pantalla (las de hardware, no las de mapa)

Sé que también puedo convertir x, y coordenadas de pantalla en GeoPoint para compararlas con mi GeoPoint, pero, debido al nivel de zoom, no puedo conseguir lo que quiero.

No sé por qué está utilizando onTouchEvent, que es para un evento que no se ha manejado por una vista. Si utiliza onTouch (View v0, MotionEvent e), esto le proporcionará la información relativa a la vista y podrá calcular las coordenadas de la pantalla utilizando los métodos getLeft y getBottom de la vista. Si realiza un proyecto con una vista de mapa que ocupa la parte inferior derecha de la pantalla, como:

Main.xml

 <?xml version="1.0" encoding="utf-8"?> <RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <com.google.android.maps.MapView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/map" android:layout_width="220dp" android:layout_height="220dp" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:apiKey="Your API key" android:clickable="true" /> </RelativeLayout> 

A continuación, ejecute este código

 public class GoogleMapsTouchActivity extends MapActivity implements OnTouchListener { private MapController mMapCtrlr; private MapView mMapVw; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); } @Override protected void onResume() { super.onResume(); mMapVw = (MapView) findViewById(R.id.map); mMapVw.setReticleDrawMode(MapView.ReticleDrawMode.DRAW_RETICLE_OVER); mMapCtrlr = mMapVw.getController(); mMapCtrlr.setZoom(15); mMapCtrlr.setCenter(new GeoPoint(53500000, -3000000)); mMapVw.setOnTouchListener(this); } @Override public boolean onTouch(View v0, MotionEvent e) { // Only fires if Mapview touched float x = e.getX(); // relative to VIEW float y = e.getY(); // relative to VIEW float x2; // relative to SCREEN float y2; // relative to SCREEN if (e.getAction() == MotionEvent.ACTION_DOWN) { Toast.makeText(this, "View x = " + x + " View y = " + y, Toast.LENGTH_SHORT).show(); x2 = mMapVw.getLeft() + x; y2 = mMapVw.getBottom() + y; Toast.makeText(this, "Screen x = " + x2 + " Screen y = " + y2, Toast.LENGTH_SHORT).show(); GeoPoint gPt = mMapVw.getProjection().fromPixels((int) x, (int)y); Toast.makeText(this, "Lat = " + gPt.getLatitudeE6() + " Lon = " + gPt.getLongitudeE6(), Toast.LENGTH_SHORT).show(); } return false; } @Override public boolean onTouchEvent(MotionEvent e) { // Only fires if screen touched outside a view float x = e.getX(); float y = e.getY(); if (e.getAction() == MotionEvent.ACTION_DOWN) { Toast.makeText(this, "Got touch EVENT x = " + x + " y = " + y, Toast.LENGTH_SHORT).show(); } return super.onTouchEvent(e); } @Override protected boolean isRouteDisplayed() {return false;} } 

Si hace clic en la vista y en el área que se encuentra fuera de la vista del mapa, los mensajes Toast deben dejarlo claro para usted.

He encontrado una solución, no sé si es la mejor manera de conseguirlo, pero funciona!

He encontrado gracias a tu ayuda @nickt, el método getScreenRect () que devuelve los límites actuales de la pantalla en coordenadas de pantalla.

Aquí el código:

 float pisteX; float pisteY; Projection projection = this.mapView.getProjection(); Point pt = new Point(); GeoPoint gie = new GeoPoint(latitude,longitude); Rect rec = mapView.getScreenRect(new Rect()); projection.toPixels(gie, pt); pisteX = pt.x-rec.left; // car X screen coord pisteY = pt.y-rec.top; // car Y screen coord 
  • Error al inicializar GoogleService
  • Para Android Map api v2 Descripción referencias biblioteca no existente google-play-services_lib \ bin \ google-play-services_lib.jar
  • Marcador de mapa de Android en Longpress se representa debajo de la zona que es realmente LongPressed (en API 15)
  • Uso de ItemizedOverlay y OverlayItem en Android Beta 0.9
  • Android Map Ampliar para mostrar todos los Pins
  • Marcadores de mapa de escala por Zoom, Android
  • Cómo mostrar las flechas de dirección en el marcador de mapa de google maps v2 android
  • Deshabilitar pan / zoom en com.google.android.maps.MapView
  • Requerido com.google.android.gms.GoogleMap encontrado vacío
  • ¿Cómo se suelta un pin en un MapView en Android?
  • Añadir una imagen a Android MapView
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.