zoukankan      html  css  js  c++  java
  • 【起航计划 004】2015 起航计划 Android APIDemo的魔鬼步伐 03 App->Activity->Animation Activity跳转动画 R.anim.×× overridePendingTransition ActivityOptions类

    App->Activity->Animation示例用于演示不同Activity切换时动态效果。

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

    渐变Fade In
    
    缩放Zoom In
    
    Modern fade In
    
    Modern zoom in
    
    Scale up
    
    Thumbnail 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());

     

  • 相关阅读:
    最全面的iOS和Mac开源项目和第三方库汇总
    15 个 Android 通用流行框架大全
    Android中常用的优秀开源框架
    iOS中拉伸图片的几种方式
    iOS View自定义窍门——UIButton实现上显示图片,下显示文字
    Java Queue的使用
    java用volatile或AtomicBoolean实现高效并发处理 (只初始化一次的功能要求)
    android开发音乐播放器--Genres和Art album的获取
    一个神奇的控件——Android CoordinatorLayout与Behavior使用指南
    在CodeBlocks 开发环境中配置使用OpenCV (ubuntu系统)
  • 原文地址:https://www.cnblogs.com/dongdong230/p/4305888.html
Copyright © 2011-2022 走看看