zoukankan      html  css  js  c++  java
  • [转]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作为参数。

      动画的资源文件放在resanim目录下,是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

      即动画资源文件需要放在resanimator目录下,且根标签是<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

      动画资源放在resanim路径下,和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

  • 相关阅读:
    spring对返回结果的拦截器
    mysql 8.0.15 的my.ini 配置
    利用apache 的PropertyUtilsBean 实现map和pojo相互转换
    给数字补0
    清空文件的内容 和 统计文件的大小的命令
    MySQL的replace函数的用法
    PHP Warning: Module 'modulename' already loaded in Unknown on line 0 的解决方法
    技术总监Sycx的故事
    编译PHP扩展的通用方法
    给大家推荐几本经典技术书籍
  • 原文地址:https://www.cnblogs.com/ZhuRenWang/p/4928960.html
Copyright © 2011-2022 走看看