मैं एक दृश्य में मानचित्र के साथ एक एंड्रॉइड मैपएक्टिविटी बनाना चाहता था, जिसे फ़्लिप किया जा सकता था और फिर किसी अन्य दृश्य में कॉन्फ़िगर किया गया था, फिर मानचित्र पर फिर से फ़्लिप किया गया था। समाधान मैं काम के साथ आया, लेकिन मुझे आश्चर्य है कि ऐसा करने का एक बेहतर तरीका है।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;
}
यह ठीक काम करता है, लेकिन यह सिर्फ अक्षम लगता है। मैं (स्पष्ट रूप से गलती से) मान लिया कि "फ़्लिपिंग" व्यूफ्लिपर कंटेनर की एक अंतर्निहित सुविधा होगी। क्या इसे पूरा करने के लिए कोई बेहतर या अधिक प्रभावी तरीका है?