【问题标题】:Activity navigation: custom animation with popEnter and popExit like fragmentsActivity 导航:自定义动画与 popEnter 和 popExit 类似的片段
【发布时间】:2016-09-26 20:16:58
【问题描述】:

使用以下代码可以使用动画更改活动:

Bundle animation = ActivityOptions.makeCustomAnimation(App.getContext(), R.anim.enter_from_right, R.anim.exit_to_left).toBundle();
startActivity(intent, animation);

对于 Fragment,您可以在 FragmentTransaction 上执行类似的操作:

// ...
transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left);
// ...

这行得通! 但是我想在按下时有一个动画(从后台弹出)。 对于片段,您只需添加 2 个动画资源(popEnter 和 popExit):

transaction.setCustomAnimations(R.anim.enter_from_right, R.anim.exit_to_left, R.anim.enter_from_left, R.anim.exit_to_right);

如何为活动创建相同的“背景动画”?

【问题讨论】:

  • 我使用了这个代码:overridePendingTransition(android.R.anim.fade_in, android.R.anim.fade_out); 您可以在GmailAnimationLopeAnimations 中看到这些示例。您还可以在Blog 中看到更多信息。
  • 我已经用同一个例子回答了我的问题,但扩展了一点 ;-)

标签: android-activity navigation android-animation onbackpressed


【解决方案1】:

我发现了另一种虽然简单但似乎效果很好的方法。活动的动画也可以使用 overridePendingTransition 来执行,因此当活动结束时,您只需使用该方法即可。

在 BaseActivity 中实现这些覆盖是最有效的,它由项目中的所有活动扩展。现在,您的所有活动都会在开始新活动时自动包含退出动画和动画:

public abstract class BaseActivity extends AppCompatActivity {

    @Override
    public void finish() {
        super.finish();
        onLeaveThisActivity();
    }

    protected void onLeaveThisActivity() {
        overridePendingTransition(R.anim.enter_from_left, R.anim.exit_to_right);
    }

    // It's cleaner to animate the start of new activities the same way.
    // Override startActivity(), and call *overridePendingTransition*
    // right after the super, so every single activity transaction will be animated:

    @Override
    public void startActivity(Intent intent) {
        super.startActivity(intent);
        onStartNewActivity();
    }

    @Override
    public void startActivity(Intent intent, Bundle options) {
        super.startActivity(intent, options);
        onStartNewActivity();
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode) {
        super.startActivityForResult(intent, requestCode);
        onStartNewActivity();
    }

    @Override
    public void startActivityForResult(Intent intent, int requestCode, Bundle options) {
        super.startActivityForResult(intent, requestCode, options);
        onStartNewActivity();
    }

    protected void onStartNewActivity() {
        overridePendingTransition(R.anim.enter_from_right, R.anim.exit_to_left);
    }
}

为了总结一下,我将包括 4 个动画资源:

enter_from_right

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="100%p"
    android:toXDelta="0%p"/>

exit_to_left

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="0%p"
    android:toXDelta="-100%p"/>

enter_from_left

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="-100%p"
    android:toXDelta="0%p"/>

exit_to_right

<translate xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:fromXDelta="0%p"
    android:toXDelta="100%p"/>

ps。您可能希望在开始/主要活动中排除退出动画;-)

public class MainMenuActivity extends BaseActivity {
    ....
    @Override
    protected void onLeaveThisActivity() {
        // Don't use an exit animation when leaving the main activity!
    }
}

2019 年 10 月 24 日编辑:

当从一个活动导航到下一个活动并在流程中完成当前活动时,请注意应在导航实现之前调用finish()。如果以错误的顺序执行此操作,onLeaveThisActivity 将在 onStartNewActivity 之后调用,从而导致错误的动画。

【讨论】:

  • 不错的方法。我也会更新答案以覆盖 startActivityForResult 方法。
  • 很好的建议 ikarhun,我会尽快尝试并更新我的代码!
  • 不错的解决方案。唯一的问题是,在我的三星 s6 上内置了这个转换的设备上,与没有它的设备相比,执行这个动画需要大约两倍的时间。我创建了一个帖子:stackoverflow.com/questions/45735395/…
  • @ikarhun 当我调试活动转换时,我发现当startActivityForResult 被调用时,不久之后startActivity 也被调用,所以可能不需要覆盖。但是,我不确定这是否总是如此,并且多次覆盖它并没有伤害
猜你喜欢
  • 2017-04-14
  • 1970-01-01
  • 1970-01-01
  • 2019-12-29
  • 1970-01-01
  • 2014-06-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多