美文网首页
android5.0 Activity过渡动效

android5.0 Activity过渡动效

作者: 郑在学_blog | 来源:发表于2017-08-01 16:32 被阅读0次

    Android5.0提供了3种Transition类型。

    1. 进入动画:一个进入的过渡动画决定一个Activity中的所有视图怎么进入屏幕。
    2. 退出动画:一个退出的过渡动画决定一个Activity中的所有视图怎么退出屏幕。
    3. 共享元素:一个共享元素过渡动画决定2个Activitys之间的过渡,怎么共享他们的视图。

    进入和退出动画

    进入和退出动画效果

    • explode(分解):从屏幕中间进或出,移动视图。
    • slide(滑动):从屏幕边缘进或出,移动试图。
    • fade(淡出):通过改变屏幕上的视图的不透明度,达到添加或移除视图。

    过渡动画第一种实现方法是:xml实现(全局),一种是通过代码实现。

    xml实现;

    1.在style.xml中设置

    <!--设置支持过渡动画-->
    <item name="android:windowContentTransitions">true</item>
    <!--设置进入动画      通过分解方式进入-->
    <item name="android:windowEnterTransition">@transition/explode</item>   
    <!--设置退出动画      通过分解方式退出-->
    <item name="android:windowExitTransition">@transition/explode</item>
    
    <item name="android:windowReenterTransition">@transition/explode</item>
    <item name="android:windowReturnTransition">@transition/explode</item>
    

    2.在res目录下,新建一个transition文件夹,创建xxx.xml文件(就是动画xml)

     explode.xml
    
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <explode
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    
    silde.xml
    
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <slide
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    
    fade.xml
    
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <fade
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    
    

    3.修改跳转Activity方式:

    Intent intent = new Intent(MainActivity.this, SlideActivity.class);
    ActivityCompat.startActivity(Login.this,intent, ActivityOptionsCompat.makeSceneTransitionAnimation(Login.this).toBundle());
    

    代码实现:

    A页面关键代码:

    Intent intent = new Intent(MainActivity.this, SlideActivity.class);
    ActivityCompat.startActivity(Login.this,intent, ActivityOptionsCompat.makeSceneTransitionAnimation(Login.this).toBundle());
    

    B页面关键代码(代码需放在setContentView()之前):

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    getWindow().setEnterTransition(new Explode());
    getWindow().setExitTransition(new Explode());
    //getWindow().setReenterTransition(new Explode());
    //getWindow().setReturnTransition(new Explode());
    setContentView()
    

    共享动画

    共享元素动画效果:

    • changeBounds:改变目标视图的布局边界。
    • changeClipBounds:裁剪目标视图边界。
    • changeTransform:改变目标的缩放比例和旋转角度。
    • changeImageTransform:改变目标图片的大小和缩放比例。
    • overlay

    共享元素动画效果关键代码:

    • setSharedElementEnterTransition();A->B,B进入动画
    • setSharedElementExitTransition();A->B,A退出动画
    • setSharedElementReenterTransition();B->A,A进入动画
    • setSharedElementReturnTransition();B->A,B退出动画

    xml实现:

    1.在style.xml中

    <!--设置支持过渡动画-->
    <item name="android:windowContentTransitions">true</item>
    
    <item name="android:windowSharedElementEnterTransition">@transition/share1</item>
    <item name="android:windowSharedElementExitTransition">@transition/share2</item>
    
    <item name="android:windowSharedElementReenterTransition">@transition/share3</item>
    <item name="android:windowSharedElementReturnTransition">@transition/share4</item>
    

    2.xml动画(res/transition/xxx.xml)

    share1.xml
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <changeBounds
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    
    share2.xml
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <changeClipBounds
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    
    share3.xml
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <changeTransform
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    
    share4.xml
    <transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
        <changeImageTransform
            android:duration="500"
            android:interpolator="@android:interpolator/accelerate_decelerate" />
    </transitionSet>
    

    3.跳转页面代码:

    一个共享元素
    
     Intent intent3 = new Intent(MainActivity.this, Share1Activity.class);
                    startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, button4, "share").toBundle());
    
    
    多个共享元素
    startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, new Pair<View, String>(button4, "share"), new Pair<View, String>(button4, "share")).toBundle());
    
    new Pair()是可变参数
    
    共享元素的key:view控件 ,value:与android:transitionName="share" 相同(也可以通过代码设置setTransitionName())
    
    <Button
        android:id="@+id/btn4"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:text="share"
        android:transitionName="share" /> 
    

    代码实现:

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    
    getWindow().setSharedElementExitTransition(new ChangeBounds());
    //getWindow().setSharedElementEnterTransition(new ChangeBounds());
    getWindow().setSharedElementReenterTransition(new ChangeBounds());
    //getWindow().setSharedElementReturnTransition(new ChangeBounds());
    
    setContentView();
    

    overlay效果

    getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
    
    getWindow().setSharedElementsUseOverlay(true);
    //        getWindow().setSharedElementsUseOverlay(false);
    

    Android Interpolator属性 设置动画速度

    xml

    android:interpolator="@android:anim/accelerate_interpolator" 设置动画为加速动画(动画播放中越来越快)  
      
    android:interpolator="@android:anim/decelerate_interpolator" 设置动画为减速动画(动画播放中越来越慢)  
      
    android:interpolator="@android:anim/accelerate_decelerate_interpolator" 设置动画为先加速在减速(开始速度最快 逐渐减慢)  
      
    android:interpolator="@android:anim/anticipate_interpolator" 先反向执行一段,然后再加速反向回来(相当于我们弹簧,先反向压缩一小段,然后在加速弹出)  
      
    android:interpolator="@android:anim/anticipate_overshoot_interpolator" 同上先反向一段,然后加速反向回来,执行完毕自带回弹效果(更形象的弹簧效果)  
      
    android:interpolator="@android:anim/bounce_interpolator" 执行完毕之后会回弹跳跃几段(相当于我们高空掉下一颗皮球,到地面是会跳动几下)  
      
    android:interpolator="@android:anim/cycle_interpolator" 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input)  
      
    android:interpolator="@android:anim/linear_interpolator" 线性均匀改变  
      
    android:interpolator="@android:anim/overshoot_interpolator" 加速执行,结束之后回弹
    

    代码

    animation.setInterpolator(new AccelerateInterpolator());  
      
    animation.setInterpolator(new DecelerateInterpolator());  
      
    animation.setInterpolator(new AccelerateDecelerateInterpolator());  
      
    animation.setInterpolator(new AnticipateInterpolator());  
      
    animation.setInterpolator(new AnticipateOvershootInterpolator());  
      
    animation.setInterpolator(new BounceInterpolator());  
      
    animation.setInterpolator(new CycleInterpolator(2));  
      
    animation.setInterpolator(new LinearInterpolator());  
      
    animation.setInterpolator(new OvershootInterpolator());
    

    相关文章

      网友评论

          本文标题:android5.0 Activity过渡动效

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