【起航计划 004】2015 起航计划 Android APIDemo的魔鬼步伐 03 App->Activity->Animation Activity跳转动画 R.anim.×× overridePendingTran

来源:互联网 发布:王宝强 知乎 编辑:程序博客网 时间:2024/06/06 07:47
App->Activity->Animation示例用于演示不同Activity切换时动态效果。

android 5.0例子中定义了6种动画效果:

渐变Fade In缩放Zoom InModern fade InModern zoom inScale upThumbnail zoom

 

 

Android 中 Animation 资源可以分为两种:

  • Tween Animation 对单个图像进行各种变换(缩放,平移,旋转等)来实现动画。
  • Frame Animation 由一组图像顺序显示显示动画。

Animation 中使用的是Tween Animation, 使用的资源为R.anim.fade, R.anim.hold,R.anim.zoom_enter, R.anim.zoom_exit。

其中R.anim.fade, R.anim.zoom_enter分别为Fade In 和 Zoom动画资源。其定义为

fade.xml

<alpha xmlns:android="http://schemas.android.com/apk/res/android"       android:interpolator="@android:anim/accelerate_interpolator"       android:fromAlpha="0.0" android:toAlpha="1.0"       android:duration="@android:integer/config_longAnimTime" />

 zoom_center.xml

<set xmlns:android="http://schemas.android.com/apk/res/android"        android:interpolator="@android:anim/decelerate_interpolator">    <scale android:fromXScale="2.0" android:toXScale="1.0"           android:fromYScale="2.0" android:toYScale="1.0"           android:pivotX="50%p" android:pivotY="50%p"           android:duration="@android:integer/config_mediumAnimTime" /></set>

 

 

tween animation 资源定义的格式如下:

<?xml version=”1.0″ encoding=”utf-8″?><set xmlns:android=”http://schemas.android.com/apk/res/android” android:interpolator=”@[package:]anim/interpolator_resource” android:shareInterpolator=[ ” truefalse “> <alpha android:fromAlpha=”float” android:toAlpha=”float” /> <scale android:fromXScale=”float” android:toXScale=”float” android:fromYScale=”float” android:toYScale=”float” android:pivotX=”float” android:pivotY=”float” /> <translate android:fromXDelta=”float” android:toXDelta=”float” android:fromYDelta=”float” android:toYDelta=”float” /> <rotate android:fromDegrees=”float” android:toDegrees=”float” android:pivotX=”float” android:pivotY=”float” /> <set></set></set>

 

<set> 为其它animation类型<alpha>,<scale>,<translate>和<rotate>或其它<set>的容器。

android:interpolator 为Interpolator资源ID,Interpolator定义了动画的变化速率,动画的各帧的显示可以加速,减速,重复显示。

android:shareInterpolator 如果想为<set>中的各个子动画定义共享interpolator,shareInterpolator 则设为true.

<alpha> 定义Fade in ,Fade out 动画,其对应的Android类AlphaAnimation,参数由fromAlpha,toAlpha定义。

<scale>定义缩放动画,其对应的Android类为ScaleAnimation,参数由 fromXScale,toXScale,fromYScale,toYScale,pivotX,pivotY定义,pivotX,pivotY定义了 缩放时的中心。

<translate>定义平移动画,其对应的Android类为TranslateAnimation,参数由fromXDelta,toXDelta,fromYDelta,toYDelta定义。

<rotate>定义选择动画,其对应的Android类RotateAnimation,参数由fromDegrees,toDegrees,pivotX,pivotY, pivotX,pivotY定义选择中心。

 

Animation中的Fade In和Zoom In按钮的事件处理代码:

    private OnClickListener mFadeListener = new OnClickListener() {        public void onClick(View v) {            // Request the next activity transition (here starting a new one).            startActivity(new Intent(Animation.this, AlertDialogSamples.class));            // Supply a custom animation.  This one will just fade the new            // activity on top.  Note that we need to also supply an animation            // (here just doing nothing for the same amount of time) for the            // old activity to prevent it from going away too soon.            overridePendingTransition(R.anim.fade, R.anim.hold);        }    };    private OnClickListener mZoomListener = new OnClickListener() {        public void onClick(View v) {            // Request the next activity transition (here starting a new one).            startActivity(new Intent(Animation.this, AlertDialogSamples.class));            // This is a more complicated animation, involving transformations            // on both this (exit) and the new (enter) activity.  Note how for            // the duration of the animation we force the exiting activity            // to be Z-ordered on top (even though it really isn't) to achieve            // the effect we want.            overridePendingTransition(R.anim.zoom_enter, R.anim.zoom_exit);        }    };

 

从代码可以看到Activity Animation到其它Activity Controls1 切换的动画使用overridePendingTransition 来定义,函数overridePendingTransition(int enterAnim, int exitAnim) 必须定义在StartActivity(Intent)或是 Activity.finish()之后来定义两个Activity切换时的动画,enterAnim 为新Activity出现时动画效果,exitAnim则定义了当前Activity退出时动画效果。

 

剩下的Modern fade In, Modern zoom in, Scale up ,Thumbnail zoom使用ActivityOptions实现Activity跳转的动画效果:

 

    private OnClickListener mModernFadeListener = new OnClickListener() {        public void onClick(View v) {            // Create the desired custom animation, involving transformations            // on both this (exit) and the new (enter) activity.  Note how for            // the duration of the animation we force the exiting activity            // to be Z-ordered on top (even though it really isn't) to achieve            // the effect we want.            ActivityOptions opts = ActivityOptions.makeCustomAnimation(Animation.this,                    R.anim.fade, R.anim.hold);            // Request the activity be started, using the custom animation options.            startActivity(new Intent(Animation.this, AlertDialogSamples.class), opts.toBundle());        }    };    private OnClickListener mModernZoomListener = new OnClickListener() {        public void onClick(View v) {            // Create a more complicated animation, involving transformations            // on both this (exit) and the new (enter) activity.  Note how for            // the duration of the animation we force the exiting activity            // to be Z-ordered on top (even though it really isn't) to achieve            // the effect we want.            ActivityOptions opts = ActivityOptions.makeCustomAnimation(Animation.this,                    R.anim.zoom_enter, R.anim.zoom_enter);            // Request the activity be started, using the custom animation options.            startActivity(new Intent(Animation.this, AlertDialogSamples.class), opts.toBundle());        }    };    private OnClickListener mScaleUpListener = new OnClickListener() {        public void onClick(View v) {            // Create a scale-up animation that originates at the button            // being pressed.            ActivityOptions opts = ActivityOptions.makeScaleUpAnimation(                    v, 0, 0, v.getWidth(), v.getHeight());            // Request the activity be started, using the custom animation options.            startActivity(new Intent(Animation.this, AlertDialogSamples.class), opts.toBundle());        }    };    private OnClickListener mZoomThumbnailListener = new OnClickListener() {        public void onClick(View v) {            // Create a thumbnail animation.  We are going to build our thumbnail            // just from the view that was pressed.  We make sure the view is            // not selected, because by the time the animation starts we will            // have finished with the selection of the tap.            v.setDrawingCacheEnabled(true);            v.setPressed(false);            v.refreshDrawableState();            Bitmap bm = v.getDrawingCache();            Canvas c = new Canvas(bm);            //c.drawARGB(255, 255, 0, 0);            ActivityOptions opts = ActivityOptions.makeThumbnailScaleUpAnimation(                    v, bm, 0, 0);            // Request the activity be started, using the custom animation options.            startActivity(new Intent(Animation.this, AlertDialogSamples.class), opts.toBundle());            v.setDrawingCacheEnabled(false);        }    };

 

Activity跳转动画是指一个Activity跳转到另外一个Activity的动画效果,我们可以通过Acitivity的overridePendingTransition()方法实现跳转动画。

这个函数接受两个参数:

  • 第一个参数为第一个Activity退出时的动画
  • 第二个参数为第二个Activity进入时的动画

这个方法必须在startActivity方法或者finish方法之后调用。

示例:

Intent intent = new Intent(MainActivity.this,OtherActivity.class);startActivity(intent);overridePendingTransition(R.anim.push_up_in,R.anim.push_up_out);

 

Android 4.1(API16)提供了一个新类ActivityOptions,用来实现Activity的切换动画。

ActivityOptions类提供了三个方法

  • makeCustomAnimation() 创建一个动画,由你自己的资源所定义:一个用来定义活动开启的动画,一个用来定义活动被关闭的动画。
  • makeScaleUpAnimation() 创建一个动画,能够从屏幕指定的位置指定的大小拉伸一个活动窗口。例如,当打开一个应用时,Android 4.1的主屏幕使用了这个方法。
  • makeThumbnailScaleUpAnimation() 创建一个动画,能够从屏幕指定的位置提供的缩略图拉伸一个活动窗口。例如,在Android 4.1的最近使用程序窗口中,当往回一个应用程序时使用了这个动画。

通过这三个方法中的一个就可以创建一个ActivityOptions示例,然后调用toBundle()方法获取一个Bundle对象,传递给startActivity方法。

示例:

 

Intent intent = new Intent(MainActivity.this,OtherActivity.class);ActivityOptions opts = ActivityOptions.makeCustomAnimation(MainActivity.this, R.anim.fade, R.anim.hold);startActivity(intent, opts.toBundle());

 

0 0
原创粉丝点击