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 crear punteros numerados dinámicamente en MapView?
- ¿Cómo puedo dibujar una flecha que muestre la dirección de manejo en MapView?
- MapView google maps NullPointerException?
- Huella digital no válida para generar la clave de Google Map para la aplicación Android
- Diferencias entre ItemizedOverlay y la clase Overlay
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.
- Android: no se pudo encontrar información sobre el proveedor de com.google.settings en el ejemplo de MapView
- Mapview y Fragmento
- Android - IllegalStateException: mapa tiene tamaño cero
- Mapview en MapActivity Clase no encontrada
- Android cómo obtener temprature de la ubicación en mapview
- Android: ¿Cómo puedo configurar el nivel de zoom de la vista del mapa en un radio de 1 km alrededor de mi ubicación actual?
- Cómo recuperar la ubicación del dispositivo actual y mostrarlo en el fragmento de mapa en un fragmento
- Utilizando OnTap (int i) con varias capas de ItemizedOverlay
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?