49.Android过渡动画的一个小练习

转载请注明出处 http://blog.csdn.net/qq_31715429/article/details/52710485
本文出自:猴菇先生的博客

Android过渡动画是在api21加入的作用在window的动画,效果如下
这里写图片描述
1.在style的theme中加上

<item name="android:windowContentTransitions">true</item>
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowAllowReturnTransitionOverlap">false</item>

2.MainActivity.java:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        setWindowAnimation();
        findViewById(R.id.next_btn).setOnClickListener(new View.OnClickListener() {

            @SuppressWarnings("unchecked")
            @Override
            public void onClick(View v) {
                Intent intent = new Intent(MainActivity.this, NextActivity.class);
                //这两个Pair是设置共享元素,transitionName需要和下一个界面中需要共享的控件设置相同的
                ActivityOptionsCompat activityOptionsCompat = ActivityOptionsCompat.makeSceneTransitionAnimation
                        (MainActivity.this, new Pair<>(findViewById(R.id.circle_iv), getString(R.string.share_circle))
                                , new Pair<>(findViewById(R.id.hello_tv), getString(R.string.share_text)));
                startActivity(intent, activityOptionsCompat.toBundle());
            }
        });
    }

    private void setWindowAnimation() {
        Slide slide = new Slide();//滑动动画
        slide.setSlideEdge(Gravity.LEFT);//设置滑出方向
        slide.setDuration(500);
        getWindow().setReenterTransition(slide);//重新进入
        getWindow().setExitTransition(slide);//离开
    }
}

3.NextActivity.java:

public class NextActivity extends AppCompatActivity {

    private static final int DELAY = 100;
    private static final int MODE_IN = 0x1;
    private static final int MODE_OUT = 0x2;

    private List<Button> btnList = new ArrayList<>();
    private LinearLayout mCircularRevealView;//用于展示圆形揭示层的布局

    @Override
    protected void onCreate(final Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_next);
        initView();
        setWindowAnimation();
        findViewById(R.id.back_btn).setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                finishAfterTransition();//在过渡动画结束后finish
            }
        });
    }

    private void setWindowAnimation() {
//        Fade fade = new Fade();//渐变动画
//        fade.setDuration(500);
//        getWindow().setEnterTransition(fade);
        Explode explode = new Explode();//分解动画
        explode.setDuration(500);
        getWindow().setEnterTransition(explode);//进入

        Slide slide = new Slide(Gravity.RIGHT);//滑动动画
        slide.setDuration(500);
        getWindow().setReturnTransition(slide);//返回

        TransitionSet transitionSet = new TransitionSet();//过渡动画集合
        ChangeBounds tvTran = new ChangeBounds();//共享元素动画
        tvTran.setDuration(500);
        tvTran.addTarget(findViewById(R.id.hello_tv));
        //在xml中inflate动画
        Transition circleTran = TransitionInflater.from(this).inflateTransition(R.transition.changebounds_with_arcmotion);
        circleTran.addTarget(findViewById(R.id.circle_iv));
        transitionSet.addTransition(tvTran).addTransition(circleTran);
        //给window设置共享元素动画
        getWindow().setSharedElementEnterTransition(transitionSet);

        //进入监听
        getWindow().getEnterTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                //创建圆形揭示层动画
                createCircularRevealAnim(MODE_IN);
                mCircularRevealView.setBackgroundResource(R.color.base_white);
            }

            @Override
            public void onTransitionEnd(Transition transition) {
                //创建按钮缩放动画
                for (int i = 0; i < btnList.size(); i++) {
                    Button btn = btnList.get(i);
                    //ViewPropertyAnimator,属性动画的简便写法
                    btn.animate().setStartDelay(i * DELAY).setDuration(500).scaleX(1).scaleY(1);
                }
            }

            @Override
            public void onTransitionCancel(Transition transition) {

            }

            @Override
            public void onTransitionPause(Transition transition) {

            }

            @Override
            public void onTransitionResume(Transition transition) {

            }
        });

        //返回监听
        getWindow().getReturnTransition().addListener(new Transition.TransitionListener() {
            @Override
            public void onTransitionStart(Transition transition) {
                //创建圆形揭示层动画
                createCircularRevealAnim(MODE_OUT);
            }

            @Override
            public void onTransitionEnd(Transition transition) {

            }

            @Override
            public void onTransitionCancel(Transition transition) {

            }

            @Override
            public void onTransitionPause(Transition transition) {

            }

            @Override
            public void onTransitionResume(Transition transition) {

            }
        });
    }

    /**
     * 创建圆形揭示层动画
     */
    private void createCircularRevealAnim(int mode) {
        //设置圆心坐标和半径
        int mCx = (mCircularRevealView.getLeft() + mCircularRevealView.getRight()) / 2;
        int mCy = (mCircularRevealView.getTop() + mCircularRevealView.getBottom()) / 2;
        int mRadius = Math.max(mCircularRevealView.getWidth() / 2, mCircularRevealView.getHeight() / 2);
        Animator anim;
        if (mode == MODE_IN) {
            anim = ViewAnimationUtils.createCircularReveal(mCircularRevealView, mCx, mCy, 0, mRadius);
        } else {
            anim = ViewAnimationUtils.createCircularReveal(mCircularRevealView, mCx, mCy, mRadius, 0);
        }
        anim.setDuration(500);
        anim.start();
    }

    private void initView() {
        mCircularRevealView = (LinearLayout) findViewById(R.id.circular_reveal_view);
        Button btn1 = (Button) findViewById(R.id.btn1);
        Button btn2 = (Button) findViewById(R.id.btn2);
        Button btn3 = (Button) findViewById(R.id.btn3);
        Button btn4 = (Button) findViewById(R.id.btn4);
        btnList.add(btn1);
        btnList.add(btn2);
        btnList.add(btn3);
        btnList.add(btn4);
    }
}

4.changebounds_with_arcmotion.xml

<?xml version="1.0" encoding="utf-8"?>
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="500"
    android:interpolator="@android:interpolator/accelerate_decelerate">
    <changeBounds />
    <!-- 弧度手势 使得共享元素动画在进行时,路线有一个弧度弯曲-->
    <arcMotion
        android:maximumAngle="90"
        android:minimumHorizontalAngle="90"
        android:minimumVerticalAngle="0" />
</transitionSet>
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值