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.
- ¿Cómo mostrar un mapa en una mapactividad de Android?
- Android Hello Map Ver problemas en el emulador
- Cómo calcular la distancia entre dos puntos en Android FAST para MUCHOS puntos
- ¿Cómo detectar el movimiento de Google MapView en Android?
- ¿Es esto un error de MapView?
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.
- Falta la biblioteca compartida en android.
- MoveCamera con CameraUpdateFactory.newLatLngBounds se bloquea
- Android Geocoder getFromLocationName devuelve siempre null
- Captura de pantalla de GoogleMap Android API V2
- La forma más simple de rotar correctamente MapView en Android?
- Android, ¿Cómo agregar opciones de mapas de Google desde el diseño XML?
- Android traza la ruta en un Mapview con dos POI-s
- Añadir crosshair overlay a google map v2
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
- Conéctese a wifi sin Internet mediante programación
- ¿Por qué dos aplicaciones diferentes utilizando aviary sdk no instalado en el mismo dispositivo?