美文网首页Android开发Android知识
Andorid Transitions Framework(过渡

Andorid Transitions Framework(过渡

作者: Haife | 来源:发表于2017-02-16 16:36 被阅读0次

    Material-Animaltion

    英文原文 https://github.com/lgvalle/Material-Animations

    这是GitHub上的一个开源项目(点击传送门), 演示View的平移、缩放动画,activity进入和退出动画,界面间元素共享。

    Andorid Transitions Framework

    了解 Transition Framework

    作用

    • 可以在activity之间跳转的时候添加动画

    • 动画共享元素之间的转换活动

    • activity中布局元素的过渡动画。

    1. Transitions between Activitys

    • Animate existing activity layout content
    image image image
    • 当你从ActivityB返回到ActivityA的时候。需要重新制定ActivityB的退出动画,可以通过如下方式
    Visiable slide = new Slide();
    slide.setDuraing(500);
    getWindow.setReturnTransition(slide);
    //别直接调用finish();
    finshAfterTransition();
    
    

    效果图

    Without Return Transition With Return Transition
    image

    那么在Fragment之间怎么实现呢?

    a) 允许过度动画

    需要在/res/style.xml添加

       <item name="android:windowContentTransitions">true</item>
       
    

    b) 在对应的xml文件指定TransitionName属性

    之前的俩个步骤和Activity之间共享元素的没有太大差别。

    c) 通过Shared Element方式启动fragment

      private void addNextFragment(Sample sample, ImageView blue, boolean b) {
            SharedElementFragment2 elementFragment2 = SharedElementFragment2.newInstance(sample);
            Slide slide = new Slide();
            slide.setDuration(getResources().getInteger(R.integer.anim_duration_medium));
            slide.setSlideEdge(Gravity.RIGHT);
            ChangeBounds changeBounds = new ChangeBounds();
            changeBounds.setDuration(getResources().getInteger(R.integer.anim_duration_medium));
            elementFragment2.setEnterTransition(slide);
            elementFragment2.setAllowEnterTransitionOverlap(b);
            elementFragment2.setAllowReturnTransitionOverlap(b);
            elementFragment2.setSharedElementEnterTransition(changeBounds);
            getFragmentManager().beginTransaction().replace(R.id.sample2_content, elementFragment2).addToBackStack(null).addSharedElement(blue, getString(R.string.square_blue_name)).commit();
        }
    
    

    效果如下

    image

    3.动画视图布局元素

    上面俩种方式都是运用于过度动画,那Transition FrameWork也可以被用做于改变布局中的某个特定的View,比如修改View的位置或者大小。我们需要确定想改变的结果即可。

    1.我们需要告诉framework我们需要改动界面的Ui

    TransitionManager.beginDelayedTransition(viewRoot);
    
    
    • 这里的viewRoot是需要改变view当前所在的根布局

    2.改变View的属性

    • 改变大小
     ViewGroup.LayoutParams params = view.getLayoutParams();
     params.witdh = 200;
     view.setlayoutParams(params);
    
    
    • 改变位置
      ViewGroup.LayoutParams params = view.getLayoutParams();
     params.gravity = Gravity.Left;
     view.setlayoutParams(params);
    
    
    Size Position
    image image

    4.共享元素+循环动画

    循环显示只是一个动画显示或隐藏一组UI元素。它可以自API21或以上使用。

    image

    红球运动轨迹 res/transition/changebounds_with_arcmotion.xml(这里不是共享动画)

    res/transition/changebounds_with_arcmotion.xml

    <?xml version="1.0" encoding="utf-8"?>
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android"
                   android:duration="@integer/anim_duration_long"
                   android:interpolator="@android:interpolator/decelerate_cubic"
        >
        <changeBounds>
            <arcMotion
                android:maximumAngle="90"
                android:minimumHorizontalAngle="90"
                android:minimumVerticalAngle="0"/>
        </changeBounds>
    </transitionSet>
    
    

    点击红色小球时 执行 revealRed()

      private void revealRed() {
            final ViewGroup.LayoutParams params = btnRed.getLayoutParams();
            Transition transition = TransitionInflater.from(this).inflateTransition(R.transition.changebounds_with_arcmotion);
            transition.addListener(new Transition.TransitionListener() {
                @Override
                public void onTransitionStart(Transition transition) {
    
                }
    
                @Override
                public void onTransitionEnd(Transition transition) {
                    animateRevealColor(bgViewGroup, R.color.sample_red);
                    body.setText(R.string.reveal_body3);
                    body.setTextColor(ContextCompat.getColor(RevealActivity.this, R.color.theme_red_background));
                    btnRed.setLayoutParams(params);
                }
    
                @Override
                public void onTransitionCancel(Transition transition) {
    
                }
    
                @Override
                public void onTransitionPause(Transition transition) {
    
                }
    
                @Override
                public void onTransitionResume(Transition transition) {
    
                }
            });
            TransitionManager.beginDelayedTransition(bgViewGroup, transition);
            final RelativeLayout.LayoutParams relativeRarams = new RelativeLayout.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT);
            relativeRarams.addRule(RelativeLayout.CENTER_IN_PARENT);
            btnRed.setLayoutParams(relativeRarams);
        }
        
        
        
        private void animateRevealColor(ViewGroup viewRoot, @ColorRes int color) {
            int cx = (viewRoot.getLeft() + viewRoot.getRight()) / 2;
            int cy = (viewRoot.getTop() + viewRoot.getBottom()) / 2;
            animateRevealColorFromCoordinates(viewRoot, color, cx, cy);
        }
        
        
        
         private Animator animateRevealColorFromCoordinates(ViewGroup root, @ColorRes int color, int cx, int cy) {
            int finalRadius = Math.max(root.getWidth(), root.getHeight());
            final Animator animator = ViewAnimationUtils.createCircularReveal(root, cx, cy, 0, finalRadius);
            root.setBackgroundColor(ContextCompat.getColor(this, color));
            animator.setDuration(getResources().getInteger(R.integer.anim_duration_long));
            animator.setInterpolator(new AccelerateInterpolator());
            animator.start();
            return animator;
        }
    

    更多信息

    相关文章

      网友评论

        本文标题:Andorid Transitions Framework(过渡

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