2010-08-10 11 views
5

मैं एक दृश्य में मानचित्र के साथ एक एंड्रॉइड मैपएक्टिविटी बनाना चाहता था, जिसे फ़्लिप किया जा सकता था और फिर किसी अन्य दृश्य में कॉन्फ़िगर किया गया था, फिर मानचित्र पर फिर से फ़्लिप किया गया था। समाधान मैं काम के साथ आया, लेकिन मुझे आश्चर्य है कि ऐसा करने का एक बेहतर तरीका है।Android ViewFlipper में Rotate3dAnimation का बेहतर कार्यान्वयन

मैं एंड्रॉयड ApiDemos से Rotate3DAnimation वर्ग की नकल की, और मेरे MapActivity वर्ग के शीर्ष पर इन की घोषणा की:

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

इसके बाद, MapActivity की मेरी onCreate विधि में मैंने किया था यह:

@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();    
     } 
    }); 



} 

और आखिरकार, मैंने उचित फ्लिप एनिमेशन का चयन करने के लिए मेनू बटन का उपयोग किया। मैंने ऐसा इसलिए किया क्योंकि यदि नक्शा सेटिंग दृश्य को प्रकट करने के लिए एक दिशा फिसलता है, तो मैं सेटिंग दृश्य को छिपाने के लिए इसे विपरीत दिशा में फ़्लिप करना चाहता था। तो मेरी onPrepareOptionsMenu में (के बाद से है कि जहाँ मेरे बटन थी) मैं ऐसा किया:

@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; 
} 

यह ठीक काम करता है, लेकिन यह सिर्फ अक्षम लगता है। मैं (स्पष्ट रूप से गलती से) मान लिया कि "फ़्लिपिंग" व्यूफ्लिपर कंटेनर की एक अंतर्निहित सुविधा होगी। क्या इसे पूरा करने के लिए कोई बेहतर या अधिक प्रभावी तरीका है?

उत्तर

1

यह सबसे अच्छा है जिसे मैं समझ सकता हूं। समस्या का हिस्सा एनीमेशन रचनाकारों के आकार तर्कों की गणना करने के लिए मानचित्र दृश्य के आकार को निर्धारित करने में असमर्थ था। मैंने अपना ऑन्रेट कोड निम्नलिखित में बदल दिया, और इसे थोड़ा सा छोटा कर दिया।

@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

जहां तक ​​मैं कहने में सक्षम हूं - नहीं। ViewFlipper एक ही एनिमेशन का उपयोग इन और आउट के लिए करता है इससे कोई फर्क नहीं पड़ता कि आप वर्तमान में कौन से दृश्य देख रहे हैं।

संबंधित मुद्दे