Android - 在活动之间更正(基于堆栈,来回正确)动画

时间:2013-07-03 09:32:53

标签: android animation android-activity transition

考虑我有以下层次结构:

  • 1级活动(例如主菜单)
    • 第2级活动(例如日历)
      • 3级活动(例如日历日)

以下用例存在:

  1. 深入
  2. 回去
  3. 将当前活动恢复到屏幕(屏幕关闭后或应用程序离开后正在运行的后台活动)
  4. 需要遵循转换行为:

    用例1 + 3: 我希望旧活动向左滑动,新活动从右侧滑入

    用例2:用例2: 我希望旧活动向右滑动,新活动从左侧滑入

    我尝试了很多方法来实现overridePendingTransition,但没有任何组合正常工作......我遇到了类似以下内容:

    public class BaseActivity extends Activity
    {
        @Override
        protected void onPause()
        {
            adjustWindowAnimation(this, false);
            super.onPause();
        }
    
        @Override
        protected void onResume()
        {
            adjustWindowAnimation(this, true);
            super.onResume();
        }
    
        protected void adjustWindowAnimation(Activity parent, boolean start)
        {
            if (start)
                parent.overridePendingTransition(R.anim.slide_from_right_in, R.anim.slide_to_left_out);
            else
                parent.overridePendingTransition(R.anim.slide_from_left_in, R.anim.slide_to_right_out);
        }
    
    //     @Override
    //     protected void onCreate(Bundle savedInstanceState)
    //     {
    //         adjustWindowAnimation(this, true);
    //         super.onCreate(savedInstanceState);
    //     }
    
    //     @Override
    //     protected void onRestoreInstanceState(Bundle savedInstanceState)
    //     {
    //         adjustWindowAnimation(this, true);
    //         super.onRestoreInstanceState(savedInstanceState);
    //     }
    
    //     @Override
    //     protected void onStart()
    //     {
    //         super.onStart();
    //         adjustWindowAnimation(this, true);
    //     }
    
    //     @Override
    //     protected void onNewIntent(Intent intent)
    //     {
    //         adjustWindowAnimation(this, true);
    //         super.onNewIntent(intent);
    //     }
    
    //     @Override
    //     protected void onStop()
    //     {
    //         adjustWindowAnimation(this, false);
    //         super.onStop();
    //     }
    
    //    @Override
    //    public void finish()
    //    {
    //        adjustWindowAnimation(this, false);
    //        super.finish();
    //    }
    
    //    @Override
    //    protected void onDestroy()
    //    {
    //        Crouton.clearCroutonsForActivity(this);
    //        super.onDestroy();
    //    }
    
    //     @Override
    //     public void onBackPressed()
    //     {
    //         adjustWindowAnimation(this, false);
    //         super.onBackPressed();
    //     }
    
    }
    

    动画(这些应该可以正常工作):

    SlideFromLeftIn:

    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
        <translate android:fromXDelta="-100%" android:toXDelta="0"
            android:duration="@android:integer/config_shortAnimTime" />
    </set>
    

    SlideFromRightIn:

    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
        <translate android:fromXDelta="100%" android:toXDelta="0"
                android:duration="@android:integer/config_shortAnimTime" />
    </set>
    

    SlideToLeftOut:

    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
        <translate android:fromXDelta="0%" android:toXDelta="-100%"
            android:duration="@android:integer/config_shortAnimTime" />
    </set>
    

    SlideToRightOut:

    <set xmlns:android="http://schemas.android.com/apk/res/android" android:interpolator="@android:anim/accelerate_interpolator">
        <translate android:fromXDelta="0" android:toXDelta="100%"
                android:duration="@android:integer/config_shortAnimTime" />
    </set>
    

1 个答案:

答案 0 :(得分:0)

要实现此类行为,您需要知道暂停和恢复的原因。就像它的另一个活动即将展示一样,然后app在onPause()中播放一个动画,但如果不是(所以它的任何其他原因),那么你播放另一个动画。在onResume()中相同 - 如果某些活动已开始,现在已完成,这就是为什么onResume()已触发,那么您将播放一个相应的动画,但如果onResume()未通过完成活动触发(返回到例如,在打电话之后的应用程序)然后你播放另一个动画。
我用以下方式做了类似的事情:

public class MainMenuActivity extends Activity{
...
    protected boolean isGoingToAlarmActivity;
    protected boolean isGoingToSettingsActivity;
    @Override
    protected void onPause() {
        // for animation choose
        if (isGoingToAlarmActivity){
            isGoingToAlarmActivity = false;
            overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
        }
        else if (isGoingToSettingsActivity){
            isGoingToSettingsActivity = false;
            overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);
        }

        super.onPause();
    }

public void onAlarmButtonClick (View button){
    isGoingToAlarmActivity = true;
    startActivity(new Intent(this, AlarmActivity.class));
}

public void onSettingsButtonClick (View button){
    isGoingToSettingsActivity = true;
    startActivity(new Intent(this, SettingsActivity.class));
}

...
}

项目菜单,警报和设置中只有3个活动。所以它进入动画“从右到左”的设置,并在返回菜单时反转,反之亦然。在AlarmActivity中:

@Override
protected void onPause() {
    // for animation choose
    if (isFinishing())
        overridePendingTransition(R.anim.slide_in_right, R.anim.slide_out_left);

    super.onPause();
}

并在SettingsActivity中:

@Override
protected void onPause() {
    // for animation choose
    if (isFinishing())
        overridePendingTransition(R.anim.slide_in_left, R.anim.slide_out_right);
    super.onPause();
}

注意:Activity的isFinishing()方法表示活动正在完成,例如当用户点击“返回”按钮时(可能有其他原因但在大多数情况下都是如此)。