您的位置:首页 > 移动开发 > Android开发

android转场动画的两种方式

2017-05-25 15:30 281 查看
有空学习一下转场动画的使用

方法一:在代码中设置

分解,滑动进入,淡入淡出

参考:http://blog.csdn.net/u012702547/article/details/51289789

用法:

首先,把之前启动Activity的代码改成下面的写法:

[java] view plain copy print?
startActivity(new Intent(this, Main2Activity.class), ActivityOptions.makeSceneTransitionAnimation(this).toBundle());


添加完成之后,在Main2Activity中设置该Activity的进出场动画即可:

1.分解

[java] view plain copy print?
getWindow().setEnterTransition(new Explode().setDuration(2000));
getWindow().setExitTransition(new Explode().setDuration(2000));


OK,就是这么简单,哦,对了,大家一定要记得在styles.xml文件中添加下面一行代码,表示激活Activity中元素的过渡效果:

[java] view plain copy print?
<item name="android:windowContentTransitions">true</item>


2.滑动进入

[java] view plain copy print?
getWindow().setEnterTransition(new Slide().setDuration(2000));
getWindow().setExitTransition(new Slide().setDuration(2000));


3.淡入淡出

[java] view plain copy print?
getWindow().setEnterTransition(new Fade().setDuration(2000));
getWindow().setExitTransition(new Fade().setDuration(2000));


4.共享元素

使用共享元素动画的时候,我们需要首先给MainActivity和Main2Activity中的两个button分别添加Android:transitionName=”mybtn”属性,并且该属性的值要相同,这样系统才知道这两个控件是共享元素。设置完成之后,接下来就是启动Activity的代码了,如下:

ActivityOptions options = ActivityOptions.makeSceneTransitionAnimation(this, mTv, "tv");
startActivityForResult(intent,REQUEST_CODE_COUNTRY,options.toBundle()/*ActivityOptions.makeSceneTransitionAnimation(this).toBundle()*/);


如果需要有多个共享元素,使用Pair

startActivity(new Intent(this, Main2Activity.class),
ActivityOptions.makeSceneTransitionAnimation(this, Pair.create(((View) iv1),"myiv"), create(((View) textView),"mytv")).toBundle());


方法二:在xml中设置

参考:http://blog.csdn.net/wl9739/article/details/52833668

步骤:

1.在 res/ 目录下创建 transition 文件夹,在该文件夹下定义界面转场动画和共享元素的动画。

2.在 res/value/style 文件中为每个 Activity 指定转场动画的 style ,并在 AndroidManifest.xml 文件中为每个 Activity 设置对应的 android:theme。

3.在 Activity 调用 startActivity() 切换动画前,使用 ActivityOptionsCompat 来创建转场动画时的共享对象。

同样是上面的三种效果,这里只演示一种集合

第一步:

detail_enter.xml

<transitionSet xmlns:android="http://schemas.android.com/apk/res/android">
<slide android:slideEdge="bottom">
<targets>
<target android:targetId="@id/cardview"/>
</targets>
</slide>

<fade>
<targets>
<target android:excludeId="@android:id/statusBarBackground"/>
<target android:excludeId="@android:id/navigationBarBackground"/>
<target android:excludeId="@id/cardview"/>
</targets>
</fade>
</transitionSet>


main_exit.xml

<?xml version="1.0" encoding="utf-8"?>
<explode xmlns:android="http://schemas.android.com/apk/res/android">
<targets>
<target android:excludeId="@android:id/navigationBarBackground"/>
<target android:excludeId="@android:id/statusBarBackground"/>
</targets>
</explode>


标签里面定义需要转场(或者不需要转场)的目标 id ,这个 id 可以使系统自带的,也可以是我们自己视图中的 view 的 id,每一个 id 需要单独在 标签中定义,android:targetId 表示目标 ID 需要进行过渡转换的 view,而 android:excludeId 表示我们不需要该 ID 的 view 进行过渡转场。上面的那段代码的意思是说,除了状态栏和导航栏以外所有的 view,都执行 explode 动画。

第二步:

styles.xml

<?xml version="1.0" encoding="utf-8"?>
<resources>

<style name="AppTheme.Main">
<item name="android:windowExitTransition">@transition/main_exit</item>
</style>

<style name="AppTheme.Detail">
<item name="windowActionBar">false</item>
<item name="android:windowNoTitle">true</item>
<item name="android:windowTranslucentStatus">true</item>
<item name="android:windowAllowEnterTransitionOverlap">false</item>
<item name="android:windowEnterTransition">@transition/detail_enter</item>
</style>

<style name="AppTheme" parent="Theme.AppCompat.Light.DarkActionBar">
<!-- Customize your theme here. -->
<item name="colorPrimary">@color/colorPrimary</item>
<item name="colorPrimaryDark">@color/colorPrimaryDark</item>
<item name="colorAccent">@color/colorAccent</item>
<item name="android:windowContentTransitions">true</item>
</style>
</resources>


第三步:

ActivityOptions options =
ActivityOptions.makeSceneTransitionAnimation(this, mTv, "tv");

Intent intent = new Intent(this, MainActivity.class);
intent.putExtra("city", "中国");
startActivityForResult(intent, REQUEST_CODE_COUNTRY,options.toBundle()/*ActivityOptions.makeSceneTransitionAnimation(this).toBundle()*/);
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息