Activity切换动画

本文共有7936个字,关键词:

问题:如何修改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过渡动画详细实现原理
版权声明:本文为作者原创,如需转载须联系作者本人同意,未经作者本人同意不得擅自转载。
添加新评论
暂无评论