2010-08-10 19 views
5

Quería crear una Android MapActivity con el mapa en una vista, que podría voltearse y luego configurarse en otra vista, y luego voltearse nuevamente al mapa. La solución que se me ocurrió funciona, pero me pregunto si hay una mejor manera de hacerlo.Mejor implementación de Rotate3dAnimation en Android ViewFlipper

copié la clase Rotate3DAnimation del ApiDemos Android, y declararon éstos en la parte superior de mi clase MapActivity:

private MapView mMapView; 
private ViewFlipper mFlipper; 
private Rotate3dAnimation mInMapAnimation; 
private Rotate3dAnimation mInStgAnimation; 
private Rotate3dAnimation mOutMapAnimation; 
private Rotate3dAnimation mOutStgAnimation; 

A continuación, en mi método onCreate de la MapActivity Hice esto:

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mapoverviewlayout); 

    // Initialize the map. 
    MapView mapView = (MapView) findViewById(R.id.mapview);  
    mapView.setBuiltInZoomControls(true);  

    // Obtain the view flipper. 
    mFlipper = (ViewFlipper)findViewById(R.id.mapviewflipper); 

    // Initialize the settings view and handle the setting clicks. 
    Button stgMapDone = (Button)findViewById(R.id.MapViewOptionsDone); 
    stgMapDone.setOnClickListener(new OnClickListener() {   
     @Override 
     public void onClick(View v) { 
      UnitOverviewMapActivity.this.mFlipper.showNext();    
     } 
    }); 



} 

Y, por último, utilicé un botón de menú para seleccionar las animaciones invertidas apropiadas. Lo hice porque si el mapa voltea una dirección para revelar la vista de configuración, quería que volteara en la dirección opuesta para ocultar la vista de configuración. Así que en mi onPrepareOptionsMenu (ya que es donde estaba mi botón) Hice esto:

@Override 
public boolean onPrepareOptionsMenu(Menu menu) { 
    if (mInMapAnimation == null) { 
     mInMapAnimation = new Rotate3dAnimation(-90, 0, mMapView.getWidth()/2, mMapView.getHeight()/2, 0.0f, false); 
     mInMapAnimation.setDuration(1000); 
     mInMapAnimation.setStartOffset(1000); 
    } 

    if (mInStgAnimation == null) { 
     mInStgAnimation = new Rotate3dAnimation(90, 0, mMapView.getWidth()/2, mMapView.getHeight()/2, 0.0f, false); 
     mInStgAnimation.setDuration(1000); 
     mInStgAnimation.setStartOffset(1000); 
    } 

    if (mOutMapAnimation == null) { 
     mOutMapAnimation = new Rotate3dAnimation(0, -90, mMapView.getWidth()/2, mMapView.getHeight()/2, 0.0f, false); 
     mOutMapAnimation.setDuration(1000); 
    } 

    if (mOutStgAnimation == null) { 
     mOutStgAnimation = new Rotate3dAnimation(0, 90, mMapView.getWidth()/2, mMapView.getHeight()/2, 0.0f, false); 
     mOutStgAnimation.setDuration(1000); 
    } 

    if (mFlipper.getCurrentView().getId() == R.id.mapparentlayout) { 
     mFlipper.setInAnimation(mInStgAnimation); 
     mFlipper.setOutAnimation(mOutMapAnimation); 
    } 
    else { 
     mFlipper.setInAnimation(mInMapAnimation); 
     mFlipper.setOutAnimation(mOutStgAnimation); 
    } 


    return true; 
} 

Esto funciona bien, pero parece ineficiente. I (al parecer erróneamente) supuse que "voltear" sería una función incorporada del contenedor ViewFlipper. ¿Hay una manera mejor o más eficiente de lograr esto?

Respuesta

1

Esto es lo mejor que pude imaginar. Parte del problema fue no poder determinar el tamaño del mapView para calcular los argumentos de tamaño para los constructores de animación. Cambié mi código onCreate a lo siguiente, y lo acorté un poco.

@Override 
public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.mapoverviewlayout); 

    // Initialize the map. 
    mMapView = (MapView) findViewById(R.id.mapview);  
    mMapView.setBuiltInZoomControls(true);  

    // Obtain the view flipper. 
    mFlipper = (ViewFlipper)findViewById(R.id.mapviewflipper);   

    // Initialize the animations.  
    Display display = ((WindowManager)getSystemService(WINDOW_SERVICE)).getDefaultDisplay();   
    int h2 = display.getHeight()/2;  
    int w2 = display.getWidth()/2; 

    mInMapAnimation = new Rotate3dAnimation(-90, 0, w2, h2, 0.0f, false); 
    mInMapAnimation.setDuration(500); 
    mInMapAnimation.setStartOffset(500); 

    mInStgAnimation = new Rotate3dAnimation(90, 0, w2, h2, 0.0f, false); 
    mInStgAnimation.setDuration(500); 
    mInStgAnimation.setStartOffset(500); 

    mOutMapAnimation = new Rotate3dAnimation(0, -90, w2, h2, 0.0f, false); 
    mOutMapAnimation.setDuration(500); 

    mOutStgAnimation = new Rotate3dAnimation(0, 90, w2, h2, 0.0f, false); 
    mOutStgAnimation.setDuration(500); 

} 
0

Por lo que he podido decir - no. ViewFlipper usa las mismas animaciones para entrar y salir sin importar qué vista esté viendo actualmente.

Cuestiones relacionadas