2010-08-10 5 views
5

지도를 한 번에 뒤집어서 다른보기에서 구성한 다음 다시지도에 뒤집어서 Android MapActivity를 만들려했습니다. 해결책을 찾았지만이 작업을 수행 할 수있는 더 좋은 방법이 있는지 궁금합니다. 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; 
} 

이 잘 작동하지만 그냥 비효율적 인 것 같다. 나는 (분명히 실수로) "뒤집기"가 ViewFlipper 컨테이너의 내장 기능이라고 가정했다. 이 작업을 수행하는 데 더 효과적인 방법이 있습니까?

답변

1

이것은 내가 생각할 수있는 최고의 것입니다. 문제의 일부가 애니메이션 생성자의 크기 인수를 계산하기 위해 mapView의 크기를 결정할 수 없습니다. onCreate 코드를 다음과 같이 변경 했으므로 코드가 상당히 짧아졌습니다.

@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는 현재보고있는 뷰와 상관없이 동일한 애니메이션을 안으로 및 밖으로 사용합니다.