studio programacion herramientas fundamentos con avanzado aplicaciones android google-maps autorotate

programacion - los mapas de Android giran automáticamente



manual de android en pdf (4)

Es posible registrar su aplicación con Sensor Listener para Orientación y obtener el ángulo relativo al norte verdadero en onSensorChanged y actualizar la cámara en consecuencia. El ángulo puede ser usado para rodamientos. Se puede utilizar el siguiente código:

Instead of using Sensor.TYPE_ORIENTATION try using getOrinetation api. Sensor.TYPE_ORIENTATION has been deprecated. @Override protected void onResume() { // TODO Auto-generated method stub super.onResume(); if (sensorManager != null) sensorManager.registerListener(this, sensorManager.getDefaultSensor(Sensor.TYPE_ORIENTATION), SensorManager.SENSOR_DELAY_GAME); } public void onSensorChanged(SensorEvent event) { float degree = Math.round(event.values[0]); Log.d(TAG, "Degree ---------- " + degree); updateCamera(degree); } private void updateCamera(float bearing) { CameraPosition oldPos = googleMap.getCameraPosition(); CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing) .build(); googleMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); }

Si abre la aplicación Google maps, hay un botón en la parte superior derecha de la pantalla que puede presionar para centrar el mapa en su ubicación actual. El icono del botón cambia entonces. Si presiona el mismo botón nuevamente, el mapa gira automáticamente según el rumbo de su brújula. En otras palabras, el mapa se vuelve egocéntrico (en oposición a la distribución AKA norte siempre arriba).

Google lanzó recientemente los mapas API V2 para Android y ciertamente me gusta más que el anterior. Por defecto, los mapas de Android V2 incluirán el botón "centrar en la ubicación". Sin embargo, al presionarlo más de una vez no se habilita la rotación automática; simplemente intenta centrar el mapa en tu ubicación nuevamente.

¿Alguien sabe cómo puedo rotar automáticamente el mapa usando la API de mapas v2 al igual que la aplicación google maps? ¿Tendré que implementar esta funcionalidad yo mismo o está en la API y simplemente no la veo? Aprecio toda la ayuda.


He implementado con éxito la solución aleph_null y aquí agregaré algunos detalles que no se mencionan en la solución aceptada:

Para que la solución anterior funcione, necesita implementar la interfaz android.hardware.SensorEventListener.

También debe registrarse en SensorEventListener en sus métodos onResume y onPause de la siguiente manera:

@Override protected void onResume() { super.onResume(); mSensorManager.registerListener(this, mRotVectSensor, SensorManager.SENSOR_STATUS_ACCURACY_LOW); } @Override protected void onPause() { // unregister listener super.onPause(); mSensorManager.unregisterListener(this); }

Nota para "@Bytecode": para evitar el parpadeo, use un valor bajo para el período de muestreo, algo como SensorManager.SENSOR_STATUS_ACCURACY_LOW.

También he notado que el sensor envía más datos de los que puede manejar el dispositivo y, como resultado, ¡la cámara de mapas comienza a moverse de una manera extraña!

Para controlar la cantidad de datos que maneja onSensorChanged, sugiero la siguiente implementación:

@Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { SensorManager.getRotationMatrixFromVector( mRotationMatrix, event.values); float[] orientation = new float[3]; SensorManager.getOrientation(mRotationMatrix, orientation); if (Math.abs(Math.toDegrees(orientation[0]) - angle) > 0.8) { float bearing = (float) Math.toDegrees(orientation[0]) + mDeclination; updateCamera(bearing); } angle = Math.toDegrees(orientation[0]); } }



Ok, así es como creo que debería hacerse un año después. Por favor corríjame si detecta algún problema.

La mayoría del código siguiente trata con una discrepancia entre los sistemas de coordenadas. Estoy usando un sensor de vector de rotación. Desde los documentos: Y is tangential to the ground at the device''s current location and points towards magnetic north. Teniendo en google maps, por otro lado, parece apuntar al norte verdadero. Esta página muestra cómo se realiza la conversión.

1) obtener la declinación actual de su ubicación GPS actual

@Override public void onLocationChanged(Location location) { GeomagneticField field = new GeomagneticField( (float)location.getLatitude(), (float)location.getLongitude(), (float)location.getAltitude(), System.currentTimeMillis() ); // getDeclination returns degrees mDeclination = field.getDeclination(); }

2) calcular el rumbo de la declinación y el norte magnético.

@Override public void onSensorChanged(SensorEvent event) { if(event.sensor.getType() == Sensor.TYPE_ROTATION_VECTOR) { SensorManager.getRotationMatrixFromVector( mRotationMatrix , event.values); float[] orientation = new float[3]; SensorManager.getOrientation(mRotationMatrix, orientation); float bearing = Math.toDegrees(orientation[0]) + mDeclination; updateCamera(bearing); } }

3) actualizar mapas

private void updateCamera(float bearing) { CameraPosition oldPos = mMap.getCameraPosition(); CameraPosition pos = CameraPosition.builder(oldPos).bearing(bearing).build(); mMap.moveCamera(CameraUpdateFactory.newCameraPosition(pos)); }