Android 一般动画Animation和属性动画Animator

来源:互联网 发布:ipad阅读pdf软件 编辑:程序博客网 时间:2024/05/18 01:36

    • 一Animations介绍
      • Animations的分类
      • Animations的使用方法代码中使用
      • Animation的四个子类
      • 具体使用方法
    • Animator介绍
    • Animation和Animator比较
      • 关键接口介绍
    • Animator使用实例
        • 布局
        • 主函数
        • animator_scalexml

一、Animations介绍

Animations是一个实现android UI界面动画效果的API,Animations提供了一系列的动画效果,可以进行旋转、缩放、淡入淡出等,这些效果可以应用在绝大多数的控件中。

Animations的分类

Animations从总体上可以分为两大类:

1、Tweened Animations:该类Animations提供了旋转、移动、伸展和淡出等效果。Alpha——淡入淡出,Scale——缩放效果,Rotate——旋转,Translate——移动效果。

2、Frame-by-frame Animations:这一类Animations可以创建一个Drawable序列,这些Drawable可以按照指定的时间间歇一个一个的显示。

Animations的使用方法(代码中使用)

Animations extends Object implements Cloneable

使用TweenedAnimations的步骤:

1.创建一个AnimationSet对象(Animation子类);
2.增加需要创建相应的Animation对象;
3.更加项目的需求,为Animation对象设置相应的数据;
4.将Animatin对象添加到AnimationSet对象当中;
5.使用控件对象开始执行AnimationSet。

Animation的四个子类:

AlphaAnimation、TranslateAnimation、ScaleAnimation、RotateAnimation

具体使用方法

可以看:http://blog.csdn.net/liujiaoruiit/article/details/48574813

Animator介绍

Animator框架是Android 4.0中新添加的一个动画框架,和之前的Animation框架相比,Animator可以进行更多和更精细化的动画控制,而且比之前更简单和更高效。在4.0源码中随处都可以看到Animator的使用。

Animation和Animator比较

Animation框架定义了透明度,旋转,缩放和位移几种常见的动画,而且控制的是一个整个View动画,实现原理是每次绘制视图时View所在的ViewGroup中的drawChild函数获取该View的Animation的Transformation值,然后调用canvas.concat(transformToApply.getMatrix()),通过矩阵运算完成动画帧,如果动画没有完成,继续调用invalidate()函数,启动下次绘制来驱动动画,动画过程中的帧之间间隙时间是绘制函数所消耗的时间,可能会导致动画消耗比较多的CPU资源。
在Animator框架中使用最多的是AnimatorSet和ObjectAnimator配合,使用ObjectAnimator进行更精细化控制,只控制一个对象的一个属性值,多个ObjectAnimator组合到AnimatorSet形成一个动画。而且ObjectAnimator能够自动驱动,可以调用setFrameDelay(longframeDelay)设置动画帧之间的间隙时间,调整帧率,减少动画过程中频繁绘制界面,而在不影响动画效果的前提下减少CPU资源消耗。

关键接口介绍

1. ObjectAnimator介绍
Animator框架封装得比较完美,对外提供的接口非常简单,创建一个ObjectAnimator只需通过如下图所示的静态工厂类直接返回一个ObjectAnimator对象。传的参数包括一个对象和对象的属性名字,但这个属性必须有get和set函数,内部会通过java反射机制来调用set函数修改对象属性值。还包括属性的初始值,最终值,还可以调用setInterpolator设置曲线函数。
2. AnimatorSet介绍
AnimatorSet主要是组合多个AnimatorSet和ObjectAnimator形成一个动画,并可以控制动画的播放顺序,其中还有个辅助类通过调用play函数获得。
3. AnimatorUpdateListner介绍
通过实现AnimatorUpdateListner,来获得属性值发生变化时的事件,在这个回调中发起重绘屏幕事件。

Animator使用实例

这里写图片描述

布局

<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"    xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"    android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"    android:paddingRight="@dimen/activity_horizontal_margin"    android:paddingTop="@dimen/activity_vertical_margin"    android:paddingBottom="@dimen/activity_vertical_margin"    android:background="#FFB6C1"    android:orientation="vertical" tools:context=".MainActivity">    <Button        android:id="@+id/button_animation"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="动画"/>    <Button        android:id="@+id/button_start_animator"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:text="翻牌"/>    <ImageView        android:id="@+id/imageview"        android:layout_width="wrap_content"        android:layout_height="wrap_content"        android:src="@mipmap/zhaoliying"        android:layout_gravity="center"/></LinearLayout>

主函数

     public void startAnimator(View view){// 图片(mImageView)的横坐标从0到1的渐变过程,效果和翻牌的效果是一样的   ObjectAnimator.ofFloat(mImageView,"scaleX",0.0f,1).setDuration(3000).start();         Animator animator= AnimatorInflater.loadAnimator(getApplicationContext(),R.animator.animator_scale);//图片根据animator_scale中定义的属性实现变化         animator.setTarget(mImageView);         animator.start();   }}

animator_scale.xml

这里写图片描述

<objectAnimator        android:duration="1000"        android:propertyName="scaleX"        android:valueFrom="1"        android:valueTo="2"></objectAnimator>   <objectAnimator    android:duration="1000"    android:propertyName="scaleY"    android:valueFrom="1"    android:valueTo="2"></objectAnimator>
1 0