Activity 导航:使用类似片段的 popEnter 和 popExit 的自定义动画
Activity navigation: custom animation with popEnter and popExit like fragments
使用以下代码可以使用动画更改活动:
Bundle animation = ActivityOptions.makeCustomAnimation(App.getContext(), R.anim.enter_from_right, R.anim.exit_to_left).toBundle();
startActivity(intent, animation);
对于片段,您可以在 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);
如何为活动创建相同的 'back-animation'?
我发现了一种不同但似乎很有效的简单方法。活动的动画也可以使用 overridePendingTransition 执行,因此当 activity 完成时,您只需使用该方法即可。
在 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。您可能希望在开始/主要 activity ;-)
中排除退出动画
public class MainMenuActivity extends BaseActivity {
....
@Override
protected void onLeaveThisActivity() {
// Don't use an exit animation when leaving the main activity!
}
}
编辑 2019 年 10 月 24 日:
当从一个 activity 导航到下一个 activity 并在此过程中完成当前 activity 时,请注意 finish()
应在导航实施之前调用。如果以错误的顺序完成,onLeaveThisActivity
将在 onStartNewActivity
之后调用,导致错误的动画。
使用以下代码可以使用动画更改活动:
Bundle animation = ActivityOptions.makeCustomAnimation(App.getContext(), R.anim.enter_from_right, R.anim.exit_to_left).toBundle();
startActivity(intent, animation);
对于片段,您可以在 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);
如何为活动创建相同的 'back-animation'?
我发现了一种不同但似乎很有效的简单方法。活动的动画也可以使用 overridePendingTransition 执行,因此当 activity 完成时,您只需使用该方法即可。
在 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。您可能希望在开始/主要 activity ;-)
中排除退出动画public class MainMenuActivity extends BaseActivity {
....
@Override
protected void onLeaveThisActivity() {
// Don't use an exit animation when leaving the main activity!
}
}
编辑 2019 年 10 月 24 日:
当从一个 activity 导航到下一个 activity 并在此过程中完成当前 activity 时,请注意 finish()
应在导航实施之前调用。如果以错误的顺序完成,onLeaveThisActivity
将在 onStartNewActivity
之后调用,导致错误的动画。