2011-05-17 23 views
5

Estoy creando una aplicación que rastrea la ruta de los usuarios en una vista de mapa. Lo que quiero lograr cuando el usuario toma un giro a la izquierda, por ejemplo, el mapa debe rotarlo de tal manera que la cabeza de la vista del mapa siempre apunte hacia arriba. Espero que tenga sentido.Android MapView giratorio

me encontré con posterior del Sr. Romain individuo una que dice

he hecho esto en el pasado y que requiere para crear una costumbre ViewGroup que gira el lienzo en el método() dispatchDraw. También necesita para aumentar el tamaño de MapView (para que dibuje suficientes píxeles cuando giró.) También deberá girar los eventos táctiles en dispatchTouchEvent(). O si utiliza Android 3.0 sólo tiene que llamar theMapView.rotate():

¿Alguien encontré con alguna solución similar a mi pregunta? Un ejemplo de trabajo sería excelente :)

+0

Véase mi respuesta aquí: [Girar MapView en Android] (http://stackoverflow.com/a/12126276/546054) – TouchBoarder

Respuesta

8

Tenga en cuenta que no es un enfoque ideal, porque el texto en el mapa es una imagen estática y girará junto con las fichas del mapa (en algún momento estará boca abajo) .

Aquí hay un ejemplo de cómo poner el MapView en su propio widget Layout y rotarlo. Lo hice con OpenStreetMaps, pero debería ser bastante similar para Google Maps.

En primer lugar crear la "rotación" Layout widget de

package com.eli.util; 

import android.content.Context; 
import android.graphics.Canvas; 
import android.util.AttributeSet; 
import android.util.DisplayMetrics; 
import android.widget.LinearLayout; 

public class RotatingLinearLayout extends LinearLayout { 

    private final int mDiagonal; 
    private float mBearing; 

    public RotatingLinearLayout(final Context pContext, final AttributeSet pAttrs) { 
     super(pContext, pAttrs); 
     final DisplayMetrics dm = pContext.getResources().getDisplayMetrics(); 
     mDiagonal = (int) Math.hypot(dm.widthPixels, dm.heightPixels); 
    } 

    public void setBearing(final float pBearing) { 
     mBearing = pBearing; 
    } 

    @Override 
    protected void dispatchDraw(final Canvas pCanvas) { 
     pCanvas.rotate(-mBearing, getWidth() >> 1, getHeight() >> 1); 
     super.dispatchDraw(pCanvas); 
    } 

    @Override 
    protected void onMeasure(final int pWidthMeasureSpec, 
      final int pHeightMeasureSpec) { 
     final int widthMode = MeasureSpec.getMode(pWidthMeasureSpec); 
     final int heightMode = MeasureSpec.getMode(pHeightMeasureSpec); 
     super.onMeasure(MeasureSpec.makeMeasureSpec(mDiagonal, widthMode), MeasureSpec.makeMeasureSpec(mDiagonal, heightMode)); 
    } 
} 

rodear de que su MapView en el layout.xml

<com.eli.util.RotatingLinearLayout 
    android:layout_width="fill_parent" 
    android:layout_height="fill_parent" 
    android:id="@+id/rotating_layout"> 
    <org.osmdroid.views.MapView 
     android:id="@+id/map_view" 
     android:layout_width="fill_parent" 
     android:layout_height="fill_parent" 
     android:enabled="true" 
     android:clickable="true"/> 
</com.eli.util.RotatingLinearLayout> 

Ahora, cada vez que reciba una solución geo, actualizar el soporte de la rotación diseño y debería girar.

+0

bueno, gracias por la respuesta . Usé tu código para hacer un diseño rotativo y funciona, pero la vista no está centrada. Lo que quiero decir es que el diseño es más grande que la pantalla, pero solo sale de la pantalla por el lado derecho y el lado inferior. ¿Cómo voy a centrar el 'RotatingLinearLayout'? – bughi

+0

@bughi Creo que en dispatchDraw tendrás que usar algunos pCanvas.translate (x, y) para cambiar el lienzo. Sin embargo, no puedo decir exactamente cómo calcular xey. – Ridcully

2

Aquí está el código que funcionó para mí tener un centrado adecuado de la vista

@Override 
protected void dispatchDraw(final Canvas pCanvas) { 
    int translateX = mDiagonal/2 - screenWidth/2; 
    int translateY = mDiagonal/2 - screenHeight/2; 

    pCanvas.translate(- translateX, - translateY); 
    pCanvas.rotate(-mBearing, mDiagonal/2, mDiagonal/2); 

    super.dispatchDraw(pCanvas); 
} 
0

puede encontrar un ejemplo en la instalación del SDK de Android

android-sdks/add-ons/addon-google_apis-google_inc_-8/samples/MapDemo 

Pero tal vez usted tiene que cambiar un poco dos métodos para obtener la orientación correcta en el evento táctil.

private class RotateView extends ViewGroup implements SensorListener { 

/* ... */ 

    private Matrix invertedMatrix = new Matrix(); 
    private float[] tempLocation = new float[2]; 


    @Override 
    protected void dispatchDraw(Canvas canvas) { 
     canvas.save(Canvas.MATRIX_SAVE_FLAG); 
     canvas.rotate(mHeading, getWidth() * 0.5f, getHeight() * 0.5f); 
     canvas.getMatrix().invert(invertedMatrix); 
     mCanvas.delegate = canvas; 
     super.dispatchDraw(mCanvas); 
     canvas.restore(); 
    } 


    @Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     centeringAllowed = false; 

     float[] location = tempLocation; 
     location[0] = ev.getX(); 
     location[1] = ev.getY(); 
     invertedMatrix.mapPoints(location); 
     ev.setLocation(location[0], location[1]); 
     return super.dispatchTouchEvent(ev); 
    } 
} 

Esta clase es parte del proyecto MapDemo

Cuestiones relacionadas