Android5.0--Activity过度动画

Android5.0–Activity过度动画

Android 提供了三种transition类型

  1. 进入动画:一个activity全部视图进入的过渡动画
  2. 退出动画:一个activity全部视图退出的过渡动画
  3. 共享元素:两个activity共享视图的过渡动画

其中进入和退出动画包括

  • explode:从屏幕中间进入或者退出视图
  • fade:通过改变视图的透明度来进入或者退出视图
  • slide:从屏幕边缘进入或者退出视图

共享元素包括

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

过渡动画有XML跟代码实现这两种方法

*(这里建议使用xml来实现,统一了页面进入和退出动画的风格,修改也比较方便)

A进入跟退出过渡动画实现

一:XML实现
1. 在style.xml中设置


<item name="android:windowContentTransitions">trueitem>

<item name="android:windowEnterTransition">@transition/explodeitem>   

<item name="android:windowExitTransition">@transition/explodeitem>
<item name="android:windowReenterTransition">@transition/explodeitem>
<item name="android:windowReturnTransition">@transition/explodeitem>

2.在res下新建transition目录,在transition目录下创建所需要的过渡动画的xxx.xml,要选择标签为transition

 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.接下来就是重点了,如何跳转并让过渡动画生效

Intent intent = new Intent(MainActivity.this, SlideActivity.class);
                //注意要调用两个参数的startActivity方法 
                startActivity(intent,ActivityOptions.makeSceneTransitionAnimation(this).toBundle());

4.好了一个进入或者退出的过渡动画就可以实现了
二:通过Java代码实现
1. 例如A跳转到B
2. A中的核心代码如下

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

3.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()

4.这样代码实现进入跟退出过渡动画就已经完成了

B共享元素

两个activity中的共享元素的transitionName要相同,否则不起作用

  • setSharedElementEnterTransition();A->B,B进入动画
  • setSharedElementExitTransition();A->B,A退出动画
  • setSharedElementReenterTransition();B->A,A进入动画
  • setSharedElementReturnTransition();B->A,B退出动画
    一: XML实现

    1. 在style.xml中(如果不设置,会使用系统默认动画)

<item name="android:windowContentTransitions">trueitem>

<item name="android:windowSharedElementEnterTransition">@transition/share1item>
<item name="android:windowSharedElementExitTransition">@transition/share2item>

<item name="android:windowSharedElementReenterTransition">@transition/share3item>
<item name="android:windowSharedElementReturnTransition">@transition/share4item>

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.跳转代码

一个共享元素(该例子是讲button4设置为共享元素)

 Intent intent3 = new Intent(MainActivity.this, Share1Activity.class);
 startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, button4, "share").toBundle());


多个共享元素
startActivity(intent3, ActivityOptions.makeSceneTransitionAnimation(this, new PairString>(button4, "share"), new PairString>(button4, "share")).toBundle());

//new Pair()是可变参数

//共享元素的key:view控件 ,value:与android:transitionName="share" 相同(也可以通过代码设置setTransitionName())

二:Java代码实现

  • ChangeBounds -捕获共享元素的layout bound,然后播放layout bound变化动画。ChangeBounds 是
    共享元素变换中用的最多的,因为前后两个activity中共享元素的大小和位置一般都是不同的。

  • ChangeTransform - 捕获共享元素的缩放(scale)与旋转(rotation)属性 ,然后播放缩放(scale)与旋转(rotation)属性变化动画。

  • ChangeClipBounds - 捕获共享元素clip bounds,然后播放clip bounds变化动画。

  • ChangeImageTransform - 捕获共享元素(ImageView)的transform matrices 属性,然后播放ImageViewtransform matrices 属性变化动画。与ChangeBounds相结合,这个变换可以让ImageView在动画中高效实现大小,形状或者ImageView.ScaleType 属性平滑过度。
    1.例如仍然是从A跳到B

A中的页面跳转代码与XML相同这里就不重复了还是建议使用xml实现

2.B中的代码

仍然是在setContentView()前

getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);

getWindow().setSharedElementExitTransition(new ChangeBounds());
//getWindow().setSharedElementEnterTransition(new ChangeBounds());
getWindow().setSharedElementReenterTransition(new ChangeBounds());
//getWindow().setSharedElementReturnTransition(new ChangeBounds());

setContentView()

3.具体的效果还是应该都敲敲看看,多敲才能真正理解,切勿眼高手低

*我只是android开发中的小学生,以上有什么错误还请各位大神多多指点,谢谢

参考:Android群英传,深入理解共享元素变换(Shared Element Transition)-上

你可能感兴趣的:(Android)