java - Android ViewFlipper中Rotate3dAnimation的更好实现

标签 java android

我想在一个 View 中创建一个带有 map 的 Android MapActivity,它可以翻转过来,然后在另一个 View 中进行配置,然后再次翻转回 map 。我想出的解决方案有效,但我想知道是否有更好的方法来做到这一点。

我从 Android 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();               
        }
    });



}  

最后,我使用菜单按钮来选择适当的翻转动画。我这样做是因为如果 map 翻转一个方向以显示设置 View ,我希望它反向翻转以隐藏设置 View 。所以在我的 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 容器的内置功能。有没有更好或更有效的方法来实现这一目标?

最佳答案

这是我能想到的最好的。部分问题是无法确定 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);

}   

关于java - Android ViewFlipper中Rotate3dAnimation的更好实现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3452687/

相关文章:

java - 如何重现 java.net.SocketException : Broken pipe

java - DecimalFormat 问题引发 StackOverFlowError?

android - Facebook Android SDK 和 IntelliJ IDEA

android - 在 Android 中生成调用图

java - 将 Spark "Library"添加到 Scala 项目

java - 如何使 JTable 的宽度 >= 封闭滚动 Pane 的宽度?

java - 连接到互联网时,Firebase Jobdispatcher 不会每次都触发

java - 无法加载.so 文件

Android Facebook 实现 SSO

java - 找不到 io.realm :realm-gradle-plugin:4. 0.0.pre.rc1