0

考虑我有以下层次结构:

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

存在以下用例:

  1. 走进深渊
  2. 回去
  3. 将当前活动带回屏幕(屏幕关闭后或离开应用程序后运行的后台活动)

需要以下转换行为:

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

用例 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();
//     }

}

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

从左滑入:

<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>
4

1 回答 1

0

要实现这种行为,您需要知道暂停和恢复的原因。就像如果它的另一个活动将被呈现,那么应用程序会播放一个动画,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 个活动。所以它进入动画“从右到左”的设置,并在返回菜单时反转,AlrmActivity 反之亦然。在警报活动中:

@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() 方法表示活动正在完成,就像用户点击后退按钮时一样(可能有其他原因,但在大多数情况下是这样)。

于 2014-02-05T22:17:20.613 回答