`
typ1984
  • 浏览: 3948 次
最近访客 更多访客>>
社区版块
存档分类
最新评论

Android属性动画 Property Animation

阅读更多
3.0以前,android支持两种动画模式,tween animation,frame animation,在android3.0中又引入了一个新的动画系统:property animation,它更改的是对象的实际属性,在View Animation(Tween Animation)中,其改变的是View的绘制效果,真正的View的属性保持不变,比如无论你在对话中如何缩放Button的大小,Button的有效点击区域还是没有应用动画时的区域,其位置与大小都不变。

    Animator:它提供了创建animation最基本的结构,基本上不会直接地用到这个类,要使用这个类,必须继承它并实现需要的功能。
    ValueAnimator:property animation主要的时间引擎,它计算了各个帧的属性值。它包括所有核心功能:计算每个帧的相关内容,负责接收更新事件,按属性值的类型自定义计算规则。一个动画需要完成两大块内容:计算各帧的相关内容和并为对象设置这些计算后的值。ValueAnimator不负责第二块内容,因此你必须由ValueAnimator监听计算值的更新并修改对象相关属性值。
    ObjectAnimator:ValueAnimator子类,它允许你设置一个对象的属性来完成动画。ObjectAnimator更加常用,因为使用它来建立动画会更加简单。然而,有时你需要用到ValueAnimator,因为ObjectAnimator会有一些限制。
    AnimatorSet:把多个Animator捆绑在一起,可以让他们同时播放,或按顺序地播放、或延时一段时间播放。

Evaluators用于告诉Property Animation系统如何去计算属性值。Property Animation系统提供了下面的一些Evaluator:

    IntEvaluator:用于计算Int类型属性值的计算器。
    FloatEvaluator:用于计算Float类型属性值的计算器。
    ArgbEvaluator:用于计算以16进制形式表示的颜色值的计算器。
    TypeEvaluator:一个计算器接口,它允许你创建你自己的计算器。如果你正在计算一个对象属性并不是int,float或者颜色值类型的,那么你必须实现TypeEvaluator接口去指定如何去计算对象的属性值。

在android.view.animation包中定义的TimeInterpolator:

    AccelerateDecelerateInterpolator:先加速后减速的插值器
    AccelerateInterpolator:加速插值器
    AnticipateInterpolator:先往变化的相反方向回退,然后甩到尾值的插值器
    AnticipateOvershootInterpolator:先往变化的相反方向回退,然后甩到尾值并越过尾值,再返回到尾值。
    BounceInterpolator: 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
    CycleInterpolator:指定重复次数的插值器
    DecelerateInterpolator:减速插值器
    LinearInterpolator:线性(匀速)插值器
    OvershootInterpolator:超过尾值再返回到尾值的插值器
    TimeInterpolator:用于实现自己的插值器的接口

ObjectAnimator与ValueAnimator的区别是ObjectAnimator可以直接地把动画过程中计算出来的的值应用到一个具体对象的属性上,而ValueAnimator需要另外注册一个监听器来完成这个工作。
一个很简单的让按钮淡入的效果来进行对比一下
ValueAnimator 实现:

         animation = ValueAnimator.ofFloat(0f , 1.0f); 
         animation.setDuration(1000); 
         animation.addUpdateListener(new AnimatorUpdateListener() { 
    @Override 
    public void onAnimationUpdate(ValueAnimator animation) { 
        button01.setAlpha((Float) animation.getAnimatedValue()); 
    } 
    ); 

ObjectAnimator 实现:

    //button01 操作的对象. 
    //对象的属性名(String) 
    animation = ObjectAnimator.ofFloat(button01, "Alpha", 0f , 1.0f); 
    animation.setDuration(1000); 

为了让ObjectAnimator能正常地运作,你还需要注意下面几点:

    要为对应的对象提供setter方法,如上例中需要为button01对象添加setAlpha(float value)方法。在不能修改对象源码的情况下,要不先对对象进行封装(extends),或者使用ValueAnimator。
    如果ObjectAnimator的工厂方法中的values... 参数提供了一个值(原本需要提供起始值和结束值),那么该值会被认为是结束值。起始值需要通过对象的getter方法提供,因此,在这种情况下,还需要提供对应属性的getter方法。
    Java代码
        ObjectAnimator.ofFloat(targetObject, "propName", 1f) 
    如果动画的对象是View,那么就可能需要在onAnimationUpdate()回调函数中调用View.invalidate()方法来刷新屏幕的显示。比如说,设置Drawable对象的color属性。但是,View中的所有setter方法,如setAlpha()andsetTranslationX()会自动地调用invalidate()方法,因此不需要额外地调用invalidat

可以看到ObjectAnimator是直接对对象进行操作,但是需要对象提供相应的 Seter/Geter 方法.而ValueAnimator需要注册一个AnimatorUpdateListener.根据getAnimatedValue 自由的进行操作.


使用AnimatorSet编排多个Animator

    mAnimationSet = new AnimatorSet(); 
    mAnimationSet.play(fadeOut).before(fadeIn); 
    mAnimationSet.play(fadeIn).with(ScaleX); 
    mAnimationSet.play(ScaleY).after(ScaleX); 

执行顺序:fadeOut > fadeIn && ScaleX > ScaleY.  刚才在测试的时候发现不能使用CycleInterpolator 进行循环.


一个按钮横向移动到父类容器的右侧的示例:


    @Override 
    public void onWindowFocusChanged(boolean hasFocus) { 
            
        Log.i(TAG, "button01.getRight():" +button01.getRight()); 
         
        //获取button01父类宽度. 
        View view = (View)button01.getParent(); 
           Log.i(TAG, "view.getRotationY():" +view.getRight()); 
            
           ObjectAnimator right = ObjectAnimator.ofFloat(button01, "x", 0 , view.getRight() - button01.getRight()); 
           right.setDuration(1000); 
           //先往变化的相反方向回退,然后甩到尾值并越过尾值,再返回到尾值。 
           right.setInterpolator(new AnticipateOvershootInterpolator()); 
            
           mAnimationSet.play(right); 
            
        super.onWindowFocusChanged(hasFocus); 
    } 
分享到:
评论

相关推荐

    Android学习之 属性动画Property Animation

    【Android属性动画Property Animation详解】 Android属性动画是Android系统中的一种强大的动画框架,它能够对任何对象的属性值进行动画化处理,无论这个对象是否在屏幕上可见。这种动画机制允许开发者定义一个动画...

    Android 属性动画(Property Animation)

    Android属性动画(Property Animation)是Android 3.0(API级别11)引入的一个强大功能,它极大地扩展了Android的动画系统,使得开发者能够实现更丰富、更动态的视觉效果。与视图动画(View Animation)不同,属性...

    Android动画之(PropertyAnimation)属性动画详解(一)

    属性动画(Property Animation)是Android 3.0(API级别11)引入的一种强大的动画系统,它极大地扩展了Android平台上的动画能力,使得开发者能够实现更为复杂和流畅的动态效果。本篇文章将深入探讨属性动画的概念、...

    Android 属性动画(Property Animation) 完全解析 源码程序

    **Android属性动画(Property Animation)完全解析** 属性动画是Android 3.0(API Level 11)引入的一种新动画机制,与视图动画(View Animation)不同,它不依赖于视图的绘制过程,而是直接改变对象的属性并实时...

    android动画例子:tween animation and property animation

    本文将深入探讨两种主要的Android动画类型:Tween Animation(平滑动画)和Property Animation(属性动画)。这两种技术都能为应用程序带来生动和交互性的效果,但它们的工作原理和应用场景有所不同。 **Tween ...

    Android 动画 Animation Demo

    Android动画主要分为两种类型:属性动画(Property Animation)和视图动画(View Animation)。本篇将深入探讨这两种动画机制,以及如何在实际项目中应用它们。 1. **视图动画(View Animation)**:视图动画是...

    android属性动画的暂停

    在Android开发中,属性动画(Property Animation)是一个强大的工具,它可以改变View对象的视觉属性,如位置、大小、颜色等,而不仅仅是简单的视图切换。属性动画系统自Android 3.0(API级别11)引入,极大地扩展了...

    Android动画之属性动画(PropertyAnimation)详解(一)

    属性动画(Property Animation)是Android 3.0(API级别11)引入的一种强大的动画系统,它极大地扩展了Android平台上的动画能力,使得开发者能够对对象的任意属性进行平滑的改变,而不仅仅局限于视图(View)的移动和...

    Android属性动画超全超详细

    Android属性动画是Android SDK中的一个强大特性,它允许开发者在运行时改变对象的属性,并以平滑、连续的方式展示变化。这个超全超详细的示例旨在深入探讨Android属性动画的各种创建方式和使用方法。 首先,属性...

    Android属性动画的实现(JAVA和XML)

    本教程将深入探讨如何使用Java和XML来实现Android属性动画。 1. **基本概念** - **属性动画系统**:Android 3.0(API级别11)引入,提供了对对象属性改变的动画支持,不仅限于View,还包括任何对象。 - **...

    Android属性动画基础Demo

    本教程将基于"Android属性动画基础Demo"来详细讲解属性动画的基本概念、使用方法以及核心API,帮助你理解和掌握这一技术。 属性动画与传统的帧动画和视图动画不同,它不依赖于UI线程,而是独立地更新对象的属性,...

    Android 属性动画和帧动画例子

    Android属性动画 属性动画是Android 3.0(API级别11)引入的一种强大工具,它允许开发者对对象的属性进行动画化,而不仅仅是移动视图。属性动画系统包括三个主要组件: - `ValueAnimator`:负责计算动画的中间值...

    Android动画之Animation

    Android动画之Animation的使用。包括变换动画Tween Animation,帧动画Frame Animation,布局动画Layout Animation,属性动画Property Animation

    android属性动画(伸展收缩)

    在这个"android属性动画(伸展收缩)"的示例中,我们将深入探讨如何利用属性动画来实现布局的伸展和收缩效果。这种效果常见于许多应用程序的展开式菜单、抽屉导航或折叠式控件中,为用户提供更丰富的视觉体验。 ...

    Android 属性动画左右移动

    通过以上步骤,我们可以实现一个简单的Android属性动画,使对象在屏幕上左右移动。实际应用中,你可以根据需求调整动画参数,如速度、方向、重复模式等,以创造出各种有趣的效果。属性动画的强大之处在于它的灵活性...

    android各种属性动画

    在`AnimationDemo`项目中,你可能会找到这些动画的示例代码,通过阅读和理解这些代码,你可以更好地掌握Android属性动画的用法,并在自己的项目中灵活应用。 总结来说,Android属性动画提供了一套强大的工具,帮助...

    android属性动画集

    现在,我们来详细探讨这个"android属性动画集"所包含的知识点。 1. **基本概念** - **属性动画**:与视图动画不同,属性动画不改变视图的实际状态,而是通过在一定时间内连续改变对象的属性值来模拟动画效果。 - ...

    android属性动画demo

    这个“android属性动画demo”涵盖了ObjectAnimator的基本用法,包括平移、旋转、尺寸变化以及透明度调整。 1. **ObjectAnimator**: ObjectAnimator是属性动画系统中的核心类,它基于值 animator(ValueAnimator)...

    Android属性动画的一些实例

    这个主题基于“Android属性动画的一些实例”,我们将深入探讨这一关键的Android UI动画技术。 属性动画是Android 3.0(API级别11)引入的新特性,与视图动画(View Animation)相比,它提供了更多灵活性和控制力。...

    Android属性动画——自定义Drawable(Robots)

    本文将深入探讨如何通过自定义Drawable来实现Android属性动画,特别是使用"Robots"这个示例来讲解。我们首先理解属性动画的基本概念,然后详细解释自定义Drawable的制作过程,并最后展示如何在实际项目中应用这些...

Global site tag (gtag.js) - Google Analytics