最近一直研究5.0的过度动画,网上找了好多帖子、博文,千篇一律,一个博文或者一个帖子,引申出好多,然并卵,基本上都说的是一共分成两种方法:
一,代码实现:
<span style="font-size:12px;">Fade fade = new Fade();
fade.setDuration(2000);
getWindow().setReenterTransition(fade);</span>
<span style="font-size:12px;"><pre name="code" class="java">Intent intent = new Intent(MainActivity.this, SlideActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());</span>
第二个activity
<span style="font-size:12px;">getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
//getWindow().setReenterTransition(new Explode());
//getWindow().setReturnTransition(new Explode());
setContentView()</span>
二,xml实现
在res目录下,新建一个transition文件夹,创建xxx.xml文件(就是动画xml)
<span style="font-size:12px;"> 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>
</span>
style:
<span style="font-size:12px;"> <style name="BaseAppTheme" parent="android:Theme.Material">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style></span>
activity跳转
<span style="font-size:12px;">Intent intent = new Intent(MainActivity.this, SlideActivity.class);
startActivity(intent, ActivityOptions.makeSceneTransitionAnimation(this).toBundle());</span>
相信自己亲手写过并调试过的都会出现一种情况,用xml写,没有效果,反正我没做出来,效果一直出不来,知道在第二个activity里边加入如下代码:
<span style="font-size:12px;">getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setEnterTransition(new Explode());
getWindow().setExitTransition(new Explode());
//getWindow().setReenterTransition(new Explode());
//getWindow().setReturnTransition(new Explode());
setContentView()</span>
但是,什么情况,这不是代码实现的动画吗?既然这样,那干嘛还浪费时间写xml动画啊,没办法继续研究吧
终于找到一篇文章,感谢作者的分享http://www.cnblogs.com/littlepanpc/p/4521624.html
首先,在你定义一个继承自材料主题的风格时,通过android:windowContentTransitions
属性激活窗口内容过渡效果。你也可以在风格定义中指定出入和共享元素过渡效果:
<span style="font-size:12px;"><style name="BaseAppTheme" parent="android:Theme.Material">
<!-- enable window content transitions -->
<item name="android:windowContentTransitions">true</item>
<!-- specify enter and exit transitions -->
<item name="android:windowEnterTransition">@transition/explode</item>
<item name="android:windowExitTransition">@transition/explode</item>
<!-- specify shared element transitions -->
<item name="android:windowSharedElementEnterTransition">
@transition/change_image_transform</item>
<item name="android:windowSharedElementExitTransition">
@transition/change_image_transform</item>
</style></span>
这个例子子中的change_image_transform
过渡效果定义如下:
<span style="font-size:12px;"><pre name="code" class="java"> <!-- res/transition/change_image_transform.xml -->
<!-- (see also Shared Transitions below) -->
<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<changeImageTransform/>
</transitionSet></span>
changeImageTransform
元素对应于ChangeImageTransform
类。
要想激活代码中的窗口内容过渡效果,得调用Window.requestFeature()
方法:
<span style="font-size:12px;"> // inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
getWindow().setExitTransition(new Explode());</span>
要在代码中指定过渡效果,调用这些方法使用Transition
类:
<span style="font-size:12px;">Window.setEnterTransition();
Window.setExitTransition();
Window.setSharedElementEnterTransition();
Window.setSharedElementExitTransition();</span>
方法setEnterTransition()
和setSharedElementExitTransition()
给调用者Acivity
定义了退出过渡效果,而方法setEnterTransition()
和setSharedElementEnterTransition()
为被调用者定义了进入过渡效果。
为了获取过渡的全部效果,你必须激活调用和被调用Activity
的窗口内容过渡效果。否则的话,否则的话,调用者Activity
将会启动退出过渡效果,但是你会看到这个窗口过渡效果的(例如缩放或者褪色)。
为了尽可能早的启动进入过渡效果,得在被调用Activity
中使用Window.setAllowEnterTransitionOverlap()
。这将使你拥有更多戏剧般美妙的进入过渡效果。
也可以这么理解:
1. 在style中使用使用android:windowContentTransitions属性,声明使用transitions,
2. 需要在xml中自定义自己的transitions,然后需要在style中写入
<span style="font-size:12px;"><!--指定进入和退出的transitions-->
<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></span>
3. 在代码中启用transitions:
<span style="font-size:12px;">// inside your activity (if you did not enable transitions in your theme)
getWindow().requestFeature(Window.FEATURE_CONTENT_TRANSITIONS);
// set an exit transition
getWindow().setExitTransition(new Explode());</span>
无语,终于弄明白了,要不是自己去试了,就被网上那些博文,帖子坑惨了,等到真正用的时候,指不定出现什么问题呢