问题:如何修改Android的Activity的转场动画?
解决:Android5.0前需要自己写,5.0后使用自带的就好
方法:
Andoid5.0之后
当前的Activity中
public void explode(View view) {
Intent intent = new Intent(this, NextTransitionActivity.class);
intent.putExtra("flag", "explode");
startActivity(intent,
ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle());
}
public void slide(View view) {
Intent intent = new Intent(this, NextTransitionActivity.class);
intent.putExtra("flag", "slide");
startActivity(intent,
ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle());
}
public void fade(View view) {
Intent intent = new Intent(this, NextTransitionActivity.class);
intent.putExtra("flag", "fade");
startActivity(intent,
ActivityOptionsCompat.makeSceneTransitionAnimation(this).toBundle());
}
切换目标的Activity中:
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
switch (getIntent().getStringExtra("flag")) {
case "explode":
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
break;
case "slide":
// 注:new Slide(Gravity.RIGHT) 可指定从哪侧滑入
getWindow().setEnterTransition(new Slide());
getWindow().setExitTransition(new Slide());
break;
case "fade":
// 注:new Fade().setDuration(1000) 可指定淡入淡出时间
getWindow().setEnterTransition(new Fade());
getWindow().setExitTransition(new Fade());
break;
}
setContentView(R.layout.activity_next_transition);
}
参考:
https://www.jianshu.com/p/097527654547
https://github.com/taoweiji/ActivityAnimationExample
https://github.com/taoweiji/ActivityAnimationExample/blob/master/article2.md
Anroid5.0前
/**
* Activity 过渡动画工具类
*/
public final class AtyTransitionUtil {
private AtyTransitionUtil() {
throw new UnsupportedOperationException("cannot be instantiated");
}
/**
* Activity 从左边进入
*
* @param activity
*/
public static void enterFromLeft(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_left_in, R.anim.sutils_right_out);
}
/**
* Activity 从左边退出
*
* @param activity
*/
public static void exitToLeft(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_right_in, R.anim.sutils_left_out);
}
/**
* Activity 从右边进入
*
* @param activity
*/
public static void enterFromRight(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_right_in, R.anim.sutils_left_out);
}
/**
* Activity 从右边退出
*
* @param activity
*/
public static void exitToRight(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_left_in, R.anim.sutils_right_out);
}
/**
* Activity 从上边进入
*
* @param activity
*/
public static void enterFromTop(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_top_in, R.anim.sutils_unchanged);
}
/**
* Activity 从上边退出
*
* @param activity
*/
public static void exitToTop(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_unchanged, R.anim.sutils_top_out);
}
/**
* Activity 从下边进入
*
* @param activity
*/
public static void enterFromBottom(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_bottom_in, R.anim.sutils_unchanged);
}
/**
* Activity 从下边退出
*
* @param activity
*/
public static void exitToBottom(@NonNull Activity activity) {
startTransition(activity, R.anim.sutils_unchanged, R.anim.sutils_bottom_out);
}
/**
* 启动过渡动画
*
* @param activity activity
* @param enterStyle activity 的进场效果样式
* @param outStyle activity的退场效果样式
*/
public static void startTransition(@NonNull Activity activity, int enterStyle, int outStyle) {
activity.overridePendingTransition(enterStyle, outStyle);
}
}
在res下创建anim包,放入下列文件
sutils_bottom_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="240"
android:fromYDelta="100%p"
android:toYDelta="0" />
</set>
sutils_bottom_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="270"
android:fromYDelta="0"
android:toYDelta="100%p" />
</set>
sutils_left_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="240"
android:fromXDelta="-100%p"
android:toXDelta="0" />
</set>
sutils_left_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="270"
android:fromXDelta="0"
android:toXDelta="-100%p" />
</set>
sutils_right_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="240"
android:fromXDelta="100%p"
android:toXDelta="0" />
</set>
sutils_right_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="270"
android:fromXDelta="0"
android:toXDelta="100%p" />
</set>
sutils_top_in.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="240"
android:fromYDelta="-100%p"
android:toYDelta="0" />
</set>
sutils_top_out.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="270"
android:fromYDelta="0"
android:toYDelta="-100%p" />
</set>
sutils_unchanged.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:duration="300"
android:fromXDelta="0"
android:fromYDelta="0"
android:toXDelta="0"
android:toYDelta="0" />
</set>
调用方法
startActivity(Intent(this,SecondActivity::class.java))
overridePendingTransition(R.anim.sutils_left_in, R.anim.sutils_left_out)
参考:
https://www.jianshu.com/p/8a67c9e537af Activity 过渡动画工具类
https://segmentfault.com/a/1190000020485087?utm_source=tag-newest Activity过渡动画详细实现原理