美文网首页
页面转场基本过渡动画

页面转场基本过渡动画

作者: 爱我O就直说 | 来源:发表于2020-01-16 17:35 被阅读0次

注:要Android 5.0 及以上才支持

1、设置支持动画

在styles里里面设置

<resources>

    <!-- Base application theme. -->
    <style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
        <!-- Customize your theme here. -->
        <item name="colorPrimary">@color/colorPrimary</item>
        <item name="colorPrimaryDark">@color/colorPrimaryDark</item>
        <item name="colorAccent">@color/colorAccent</item>

<!--        <item name="android:windowNoTitle">true</item>-->
        <item name="windowNoTitle">true</item>
<!--        <item name="android:windowActionBar">false</item>-->

        //设置支持动画
        <item name="android:windowContentTransitions">true</item>
        <!--动画重叠,默认true,false就是要等另一个动画走完了才走该动画-->
<!--        <item name="android:windowAllowEnterTransitionOverlap">false</item>-->
<!--        <item name="android:windowAllowReturnTransitionOverlap">false</item>-->
    </style>

</resources>
2、定义动画
         // 侧滑动画
        Slide transition = new Slide();
        transition.setSlideEdge(Gravity.LEFT);
        // 爆炸效果的动画
        Explode transition2 = new Explode();
        // 渐变动画
        Fade transition3 = new Fade();
        transition.setDuration(getResources().getInteger(R.integer.anim_duration_long));
        transition2.setDuration(getResources().getInteger(R.integer.anim_duration_long));
        transition3.setDuration(getResources().getInteger(R.integer.anim_duration_long));

3、设置动画

页面继承AppCompatActivity,否则要加判断 if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP)

        getWindow().setExitTransition(transition); //跳转时的退出时动画
        getWindow().setReenterTransition(transition2); //重新进入时动画
        getWindow().setEnterTransition(transition); //进入时的动画
        getWindow().setReturnTransition(transition2); //返回时的退出动画
4、页面跳转

Pair是共享动画的共享元素,没有共享动画元素 可不传,下面再说共享动画

 //Pair是共享动画的共享元素,没有共享动画元素 可不传
 Pair<View, String>[] pairs = TransitionHelper.createSafeTransitionParticipants(this, false, new Pair<View, String>(tv1, tv1.getTransitionName()));
                ActivityOptionsCompat aoc = ActivityOptionsCompat.makeSceneTransitionAnimation(this, pairs);
                startActivity(new Intent(this, TwoActivity.class), aoc.toBundle());

5、页面关闭

supportFinishAfterTransition();
如果页面没有继承AppCompatActivity,就这样写

if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
            finishAfterTransition();
        } else
            super.finish();

上面用到的工具类,主要是处理状态栏和导航栏是否也要跟着动画

/**
 * Wing_Li
 * 2016/9/14.
 * 共享过渡动画加入状态栏和导航栏,这样页面转场动画时 状态栏和导航栏 不会跟着动
 */
public class TransitionHelper {
    /**
     * 创建所需的活动过渡期间避免与系统UI小过渡的参与者。
     *
     * @param activity         The activity used as start for the transition.
     * @param includeStatusBar 如果是错误的,状态栏将不会被添加为过渡参与者
     * @return All transition participants.
     */
    public static Pair<View, String>[] createSafeTransitionParticipants(@NonNull AppCompatActivity activity, boolean
            includeStatusBar, @Nullable Pair... otherParticipants) {
        // Avoid system UI glitches as described here:
        // https://plus.google.com/+AlexLockwood/posts/RPtwZ5nNebb
        View decor = activity.getWindow().getDecorView();
        View statusBar = null;
        if (includeStatusBar) {
            statusBar = decor.findViewById(android.R.id.statusBarBackground);
        }
        View navBar = decor.findViewById(android.R.id.navigationBarBackground);

        // 创建一对过渡参与者。
        List<Pair> participants = new ArrayList<>(3);
        addNonNullViewToTransitionParticipants(statusBar, participants);
        addNonNullViewToTransitionParticipants(navBar, participants);
        // only add transition participants if there's at least one none-null element
        // 只有添加过渡参与者,如果至少有一个非空元素
        if (otherParticipants != null && !(otherParticipants.length == 1 && otherParticipants[0] == null)) {
            participants.addAll(Arrays.asList(otherParticipants));
        }
        return participants.toArray(new Pair[participants.size()]);
    }

    private static void addNonNullViewToTransitionParticipants(View view, List<Pair> participants) {
        if (view == null) {
            return;
        }
        participants.add(new Pair<>(view, view.getTransitionName()));
    }

}

至此,已经实现了基本的转场过渡动画了,
添加共享动画元素 :

两个控件的属性android:transitionName 的值 一样即可:

1.png

相关文章

网友评论

      本文标题:页面转场基本过渡动画

      本文链接:https://www.haomeiwen.com/subject/zqafzctx.html