[转]Android Activity和Fragment的转场动画
Android Activity和Fragment的转场动画
Activity转场动画
Activity的转场动画是通过overridePendingTransition(int enterAnim, int exitAnim)实现的。
这个方法是API Level 5 加入的。
这个方法在startActivity(Intent) or finish()之后被调用,指定接下来的这个转场动画。
方法的第一个参数:enterAnim,是新的Activity的进入动画的resource ID;
第二个参数exitAnim,是旧的Activity(当前的Activity)离开动画的resource ID。
所以这两个参数的对象是两个Activity。
如果上面两个参数没有动画要设置,则用0作为参数。
动画的资源文件放在res\anim\目录下,是View Animation。
参见本博客博文:Android Animation学习(六) View Animation介绍
View Animation包含了基本的动画类型,基本可以满足一般转场动画的需要。
根节点可以是:<alpha>, <scale>, <translate>, <rotate>, interpolator element, 或者是<set>。
利用set可以进行各种嵌套组合。
代码例子:
Intent intent = new Intent(TestActivities.this,TestActivityFirst.class);
startActivity(intent);
// transaction animation
overridePendingTransition(R.anim.slide_in_bottom,R.anim.slide_out_bottom);
其中两个动画:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="100%p" android:toYDelta="0"
android:duration="2000"/>
<alpha android:fromAlpha="0.0" android:toAlpha="1.0"
android:duration="2000" />
</set>


<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<translate android:fromYDelta="0%p" android:toYDelta="100%p"
android:duration="2000"/>
<alpha android:fromAlpha="1.0" android:toAlpha="0.0"
android:duration="2000" />
</set>

Fragment转场动画
Fragment的转场动画实现分为使用v4包和不使用v4包两种情况,不使用v4包的话,最低API Level需要是11。
标准转场动画:
可以给Fragment指定标准的转场动画,通过setTransition(int transit)方法。
该方法可传入的三个参数是:
TRANSIT_NONE,
TRANSIT_FRAGMENT_OPEN,
TRANSIT_FRAGMENT_CLOSE
分别对应无动画、打开形式的动画和关闭形式的动画。
标准动画设置好后,在Fragment添加和移除的时候都会有。
自定义转场动画
自定义转场动画是通过setCustomAnimations()方法,因为Fragment添加时可以指定加入到Back Stack中,所以转场动画有添加、移除、从Back stack中pop出来,还有进入四种情况。
注意setCustomAnimations()方法必须在add、remove、replace调用之前被设置,否则不起作用。
android.app.Fragment
类参考:
Fragment:http://developer.android.com/reference/android/app/Fragment.html
FragmentTransaction:http://developer.android.com/reference/android/app/FragmentTransaction.html
不使用v4包的情况下(min API >=11)所对应的动画类型是Property Animation。
即动画资源文件需要放在res\animator\目录下,且根标签是<set>, <objectAnimator>, or <valueAnimator>三者之一。
这一点也可以从Fragment中的这个方法看出:onCreateAnimator(int transit, boolean enter, int nextAnim),返回值是Animator。
自定义转场动画时,四个参数的形式setCustomAnimations (int enter, int exit, int popEnter, int popExit)是API Level 13才有的,11只引入了两个动画的形式,即无法指定Back Stack栈操作时的转场动画。
代码例子:

private void addFragment() {
if (null == mFragmentManager) {
mFragmentManager = getFragmentManager();
}
mTextFragmentOne = new MyFragmentOne();
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
// 标准动画
// fragmentTransaction
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_OPEN);
// fragmentTransaction
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_FADE);
// fragmentTransaction
// .setTransition(FragmentTransaction.TRANSIT_FRAGMENT_CLOSE);
// 自定义动画
// API LEVEL 11
fragmentTransaction.setCustomAnimations(
R.animator.fragment_slide_left_enter,
R.animator.fragment_slide_right_exit);
// API LEVEL 13
// fragmentTransaction.setCustomAnimations(
// R.animator.fragment_slide_left_enter,
// R.animator.fragment_slide_left_exit,
// R.animator.fragment_slide_right_enter,
// R.animator.fragment_slide_right_exit);
fragmentTransaction.add(R.id.container, mTextFragmentOne);
// 加入到BackStack中
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}

其中四个动画是从ApiDemos中拿来的:
fragment_slide_left_enter:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="100dp" android:valueTo="0dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

fragment_slide_left_exit:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0dp" android:valueTo="-100dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="1.0" android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

fragment_slide_right_enter:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="-100dp" android:valueTo="0dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0.0" android:valueTo="1.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

fragment_slide_right_exit:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="0dp" android:valueTo="100dp"
android:valueType="floatType"
android:propertyName="translationX"
android:duration="@android:integer/config_mediumAnimTime" />
<objectAnimator
android:interpolator="@android:interpolator/decelerate_quint"
android:valueFrom="1.0" android:valueTo="0.0"
android:valueType="floatType"
android:propertyName="alpha"
android:duration="@android:integer/config_mediumAnimTime" />
</set>

android.support.v4.app.Fragment
Fragment:http://developer.android.com/reference/android/support/v4/app/Fragment.html
FragmentTransaction:http://developer.android.com/reference/android/support/v4/app/FragmentTransaction.html
使用v4包,Fragment的使用不再局限于API Level 11之上,低等级的API也可以使用,但是这时候转场动画的类型是View Animation。
动画资源放在res\anim\路径下,和Activity的转场动画一样。
Fragment中的方法:onCreateAnimation(int transit, boolean enter, int nextAnim)返回值Animation。
FragmentTransaction中的setCustomAnimations()方法,两参数类型和四参数类型都可用。
所以一般还是用v4包的这个版本,一是兼容性比较好,另外View Animation其实基本可以满足转场动画的需要。
代码例子:

private void addFragment() {
if (null == mFragmentManager) {
mFragmentManager = getSupportFragmentManager();
}
mTextFragmentOne = new MyFragmentOne();
FragmentTransaction fragmentTransaction = mFragmentManager
.beginTransaction();
fragmentTransaction.setCustomAnimations(
R.anim.push_left_in,
R.anim.push_left_out,
R.anim.push_left_in,
R.anim.push_left_out);
fragmentTransaction.add(R.id.container, mTextFragmentOne);
fragmentTransaction.addToBackStack(null);
fragmentTransaction.commit();
}

Demo:
完整的例子项目:https://github.com/mengdd/HelloTransactionAnimations
[转]Android Activity和Fragment的转场动画的更多相关文章
- Android Activity和Fragment的转场动画
Android Activity和Fragment的转场动画 Activity转场动画 Activity的转场动画是通过overridePendingTransition(int enterAnim, ...
- Android Activity和Fragment传递数据
1.Activity与Activity传递数据 UserLoginActivity.java: Intent welcomePage = new Intent(); Bundle dataBundle ...
- Android --Activity与Fragment通讯
参考博客:详解Fragment跟Activity之间的通信 Activity中方法 private OnSearchListener mSearchListener; /** *定义一个借口 **/ ...
- android activity和fragment的生命周期图
Activity的生命周期: Fragment的生命周期:
- android activity and fragment活动周期
1.状态 /* 每个活动一共有四种状态 *:1.运行状态,就是栈顶的那个 * 2.暂停状态:就是不处于栈顶,但是依然可见,比如对话框下面的界面 * 3.停止状态:不处于栈顶,并且不可见 * 4.销毁状 ...
- Android Activity和Fragment生命周期图
- Android Activity与Fragment生命周期
- Android Activity与Fragment生命周期 对应关系
- 018 Android Activity界面移入与移出的动画效果
1.平移动画 上一页移入动画 (-屏幕宽度,y)------>(0,y) 上一页移出动画 (0,y)-------------->(屏幕宽度,y) 下一页移入动画 (屏幕宽度,y)---- ...
随机推荐
- Git HTTPS 方式自动保存用户名密码
一行命令搞定: git config --global credential.helper wincred 第一次输入用户名和密码提交,第二次就不需要了 参考: https://help.github ...
- NEO发行资产Token
NEO注册发行全局资产(Token 和 Share)功能已经在neo-gui里面集成,发行非常方便, 高级-注册资产 注册Token消耗GAS感人 4990 Gas 点击调用,获取交易ID为资产ID ...
- 数据库与sql注入的相关知识
数据库与sql注入的相关知识 sql语句明显是针对数据库的一种操作,既然想通过sql注入的方法来拿取数据那么就要先了解一下如何的去操作数据库,这方面并不需要对数据库有多么的精通但是如果了解掌握了其中的 ...
- docker之安装和基本使用(一)
前言 开始折腾docker. 主要概念 容器:独立运行的一个或一组应用,与其他应用完全独立. 镜像:用于创建 Docker容器的模板. 仓库:用于收纳镜像文件,可以理解为代码控制中的代码仓库 注意: ...
- WPF之模拟打开或关闭Windows功能
用WPF模拟打开或关闭Windows功能的实现方法其实很简单,主要用递归判断当前节点的子节点和父节点的选中状态就行了. 一.效果演示 先看看效果图: 二.部分代码 xaml代码: <TreeVi ...
- 服务号使用微信网页授权(H5应用等)
获取授权准备 AppId 服务号已经认证且获取到响应接口权限 设置网页授权域名 公众号设置 - 功能设置 - 网页授权域名.注意事项: 回调页面域名或路径需使用字母.数字及"-"的 ...
- 转载:Logistic回归原理及公式推导
转载自:AriesSurfer 原文见 http://blog.csdn.NET/acdreamers/article/details/27365941 Logistic回归为概率型非线性回归模型,是 ...
- Condition接口
<Java并发编程艺术>读书笔记 Condition介绍 任意一个Java对象,都拥有一组监视器方法(定义在java.lang.Object中),主要包括wait().wait(long ...
- 【Mac】Chrome中添加截图扩展插件FireShot方法
FireShot是一款可以使用谷歌浏览器快速捕捉当前网页中元素的chrome截图插件,在谷歌浏览器中安装FireShot插件以后可以对网页中整个屏幕或者是网页的部分视图进行截图操作,在截图之后用户还可 ...
- java中Property类的基本用法
1 配置.properties文件 2 获取输入流的方法 1)FileInputStream fi = new FileInputStream(properties文件路径); 2)InputStre ...