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的转场动画的更多相关文章

  1. [转]Android Activity和Fragment的转场动画

    Android Activity和Fragment的转场动画 Activity转场动画 Activity的转场动画是通过overridePendingTransition(int enterAnim, ...

  2. Android Activity和Fragment传递数据

    1.Activity与Activity传递数据 UserLoginActivity.java: Intent welcomePage = new Intent(); Bundle dataBundle ...

  3. Android --Activity与Fragment通讯

    参考博客:详解Fragment跟Activity之间的通信 Activity中方法 private OnSearchListener mSearchListener; /** *定义一个借口 **/ ...

  4. android activity和fragment的生命周期图

    Activity的生命周期: Fragment的生命周期:

  5. 018 Android Activity界面移入与移出的动画效果

    1.平移动画 上一页移入动画 (-屏幕宽度,y)------>(0,y) 上一页移出动画 (0,y)-------------->(屏幕宽度,y) 下一页移入动画 (屏幕宽度,y)---- ...

  6. android activity and fragment活动周期

    1.状态 /* 每个活动一共有四种状态 *:1.运行状态,就是栈顶的那个 * 2.暂停状态:就是不处于栈顶,但是依然可见,比如对话框下面的界面 * 3.停止状态:不处于栈顶,并且不可见 * 4.销毁状 ...

  7. Android Activity和Fragment生命周期图

  8. Android Activity与Fragment生命周期

  9. Android Activity与Fragment生命周期 对应关系

随机推荐

  1. caffe-window搭建自己的小项目例子

    手头有一个实际的视觉检测的项目,用的是caffe来分类,于是需要用caffe新建自己的项目的例子.在网上找了好久都没有找到合适的,于是自己开始弄. 1 首先是配置caffe的VC++目录中的inclu ...

  2. QWebView在 Qt 5.x中编译出错:File not found: main.obj

    错误现象 近日由于项目需要,想要学习一下QWebView的使用.于是简单的建立了一个Qt工程,并编写了如下代码: #include <QApplication> #include < ...

  3. Auto Mapper04(MVC中的配置)

    学习如何在MVC项目中配置AutoMapper. 一:首先在MVC项目中引用AutoMapper的DLL文件,接着创建一个接口,这里面我们需要定义两个方法,接口里面的方法只能定义不能实现,也没有什么修 ...

  4. 用python生成一个导出数据库的bat脚本文件

    # 环境: python3.x def getExportDbSql(db, index): # 获取导出一个数据库实例的sql语句 sql = 'mysqldump -u%s -p%s -h%s - ...

  5. Win10 IoT C#开发 5 - 操作 IoT 设备内嵌 SQLite 数据库 CURD

    Windows 10 IoT Core 是微软针对物联网市场的一个重要产品,与以往的Windows版本不同,是为物联网设备专门设计的,硬件也不仅仅限于x86架构,同时可以在ARM架构上运行. 前几章我 ...

  6. MySQL的Incorrect string value错误

    用以下SQL语句向表2中插入数据: insert into 表2 select * from 表1 结果出现Incorrect string value错误: 打开表2一看,里面全是问号: 后来才发现 ...

  7. mysql---ENCODE警告

    'ENCODE' is deprecated and will be removed in a future release. Please use AES_ENCRYPT instead ***** ...

  8. Ext.grid.Panel表格分页存储过程

    /*首先需要引入两个Extjs插件类 Ext.ux.data.PagingMemoryProxy和Ext.ux.ProgressBarPager这两个类*/ /*下面是控制弹出窗体放大缩小时窗体居中的 ...

  9. 第 17 章 CSS 边框与背景[下]

    学习要点: 1.设置背景 主讲教师:李炎恢 本章主要探讨 HTML5 中 CSS 边框和背景,通过边框和背景的样式设置,给元素增加更丰富的外观. 一.设置背景 盒模型的尺寸可以通过两种方式实现可见性, ...

  10. Java基础复习笔记系列 十三 反射机制

    主题:Java反射机制 学习资料参考网址: 1.http://www.icoolxue.com 1.Java反射机制. 各种框架中都使用到了Java的反射机制. 两个类:java.lang.Class ...