① view的滑动和弹性滑动
了解view的滑动必须要先了解以下几个概念:
view的位置参数:
(1)、left、top、right、bottom分别表示view相对于父控件的左上顶点的坐标和右下顶点的坐标;分别通过getLeft()、getTop()、getRight()、getBottom()获得。
(2)、x、y、translationX、translationY。x、y表示view的左上顶点的坐标;translationX、translationY表示view的左上顶点相对于父控件的偏移量。
(3)、getX()、getY()获取的是相对于父控件的坐标;getRawX()、getRawY()获取的是相对于手机屏幕的坐标。
TouchSlop:常量;和手机设备有关;表示系统所能识别的最小的滑动距离。可以通过ViewConfiguration.get(getContext()).getScaledTouchSlop()获取;
由于手机屏幕小,所以需要通过滑动来对内容进行显示和隐藏。view的滑动主要有三种方式:1、通过view的scrollTo/scrollBy方法实现;2、通过动画给view进行平移操作;3、改变view的Layoutparmes参数,是view进行重新布局,实现滑动。
(1)、scrollTo/scrollBy:mScrollX是view的左边缘和内容的左边缘的距离;mScrollY是view的上边缘和内容的上边缘的距离。当view的左边缘在内容的左边缘的右边的时候,mScrollX是正值;当view的上边缘在内容的上边缘的下边时,mScrollY为正值;scrollTo和scrollBy方法不会改变view在布局中的位置,改变的是内容的位置。scrollTo()方法让View相对于初始的位置滚动某段距离,scrollBy()方法则是让View相对于当前的位置滚动某段距离。同时可以发现scrollBy()是通过scrollTo()方法实现的。
(2)、通过动画:系统动画并不能真正改变view的位置参数,如果希望动画执行完后状态得以保留,那么必须将fillAfter属性设为true;使用属性动画就不会有这些问题,但是属性动画在android3.0无法使用,必须使用nineoldandroids兼容库。注意使用兼容库中的ViewHelper帮助类中的方法。
(3)、通过改变Layoutparmes:view.setLayoutParams();
弹性滑动:1、通过Scroller。2、通过动画。3、通过延时策略。
首先看一下Scroller的典型用法:
mScroller.startScroll(scrollX, 0, deltaX, 0, 500);只是启动滑动,但是控件并不会滑动,真正造成滑动的是下面的invalidate()方法,invalidate()的调用会使得view重绘,调用computeScroll()方法,在computeScroll()方法里面会判断滑动是否结束,computeScrollOffset返回值为true表示滑动未结束,返回false表示滑动结束;滑动未结束的时候调用scrollTo()进行滑动,并调用invalidate(),如此循环直到computeScrollOffset返回true为止。
延时策略:通过Handler发送并接收延时消息,每次接收到消息便完成一次ScrollTo操作,从而实现弹性滑动的效果。但是需要注意的是,由于系统的消息调度需要时间,完成这次弹性滑动的时间总是大于if条件判断为true的次数乘以20ms(延迟消息的发送时间间隔)。因此对弹性滑动完成总时间有精确要求的使用场景下,使用延时策略是一个不太合适的选择。
public void handleMessage(Message msg) {
switch(mag.what){
case SCROLL_FRACTION:{
//if判断滑动还没有结束,结束则不再滑动和发送消息
if(){
//通过滑动完成比例计算该次滑动片段的位置点scrollX,scrollY
View.scrollTo(scrollX,scrollY);
mHandler.sendEmptyMessageDelayed(SCROLL_FRACTION, 20);
}
break;
}
default:
break;
}
}
② 知识体系四:Android动画工作原理
1.Android 动画的工作原理?
在android系统中动画分为两种分别是帧动画和属性动画。对于动画的工作原理主要涉及到的是帧动画的实现。
帧动画主要有旋转RotatleAnimation,缩放ScaleAnimation,透明AlphaAnimation,平移TranslateAnimation等都是Animation的子类。Animation控制动画的效果,Transformation 对动画进行计算。
对于动画的原理简单说就是从一个动画的启动状态,到动画结束状态,和动画持续总时间,在这段时间中任一时间点动画的状态计算和显示的过程。
计算 :是通过Animation的getTransformation()方法首先对时间进行归一化时间让时间在0~1之间,进行计算。满足条件之后就会调用applyTransformation()方法处理实现动画类型的计算。当前时间点的转换状态保存到Transformation 的Matrix中等待显示的时候使用。
显示 :动画显示工作主要依赖于Choreograther类,此类是线程唯一的,Choreograther和Handler用法类似,都是通过post一个Runnable对象到队列中等待VSYSC屏幕垂直同步信号刷新(16ms)刷新一次,然后触发ViewRootImpl的view的遍历工作,回调到view.draw()方法时就会把之前applyTransformation 计算的此时刻的Transformation 的Matrix赋值到Canvas上, 这也就是为什么我们使用帧动画时候我们的view的属性并没有改变,这就是根源因为计算得到的Matrix被Canvas使用了,并没有直接赋值到我们的view上。 对于属性动画来说主要使用animator实现看下面解析:
2.Animation 和 Animator 的区别?
Animation和Animator都是抽象类,都有子类,Animation通过Transformation对动画进行Matrix转换来作用到Canvas上实现动画效果。而Animator只是一个工具类,主要是用来控制在一段时间内某一个值的变化过程,然后我们再根据这个值来作用到view的属性上,以此来实现动画效果。为了让这个变化的过程能达到加速减速等变化效果系统提供了插值器Interpolator。他们的实现思想都是一致的。
3.帧动画 和 属性动画的区别?
③ android中的动画有哪几类,它们的特点和区别是什么
Android中的常用动画有三种:
1、View Animation(Tween Animation 补间动画)
动画的对象除了传统的View对象,还可以是Object对象,动画之后,Object对象的属性值被实实在在的改变了。Propertyanimation能够通过改变View对象的实际属性来实现View动画。任何时候View属性的改变,View能自动调用invalidate()来试试刷新。
④ android属性动画详解
在 Android 动画中,总共有两种类型的动画View Animation(视图动画)和Property Animator(属性动画);其中
View Animation包括Tween Animation(补间动画)和Frame Animation(逐帧动画);
Property Animator包括ValueAnimator和ObjectAnimation;
首先,直观上,他们有如下三点不同:
1、引入时间不同: View Animation是API Level 1就引入的。Property Animation是API Level 11引入的,即Android 3.0才开始有Property Animation相关的API。
2、所在包名不同: View Animation在包android.view.animation中。而Property Animation API在包 android.animation中。
3、动画类的命名不同: View Animation中动画类取名都叫XXXXAnimation,而在Property Animator中动画类的取名则叫XXXXAnimator大家都知道逐帧动画主要是用来实现动画的,而补间动画才能实现控件的渐入渐出、移动、旋转和缩放的;而Property Animator是在Android 3.0版本才引入的,之前是没有的。
为什么还要引入Property Animator呢?
1、为什么引入Property Animator(属性动画)
我提出一个假设:请问大家,如何利用补间动画来将一个控件的背景色在一分钟内从绿色变为红色?这个效果想必没办法仅仅通过改变控件的渐入渐出、移动、旋转和缩放来实现吧,而这个效果是可以通过Property Animator完美实现的
**这就是第一个原因:Property Animator能实现补间动画无法实现的功能 **大家都知道,补间动画和逐帧动画统称为View Animation,也就是说这两个动画只能对派生自View的控件实例起作用;而Property Animator则不同,从名字中可以看出属性动画,应该是作用于控件属性的!正因为属性动画能够只针对控件的某一个属性来做动画,所以也就造就了他能单独改变控件的某一个属性的值!比如颜色!这就是Property Animator能实现补间动画无法实现的功能的最重要原因。
**我们得到了第二点不同:View Animation仅能对指定的控件做动画,而Property Animator是通过改变控件某一属性值来做动画的。
**假设我们将一个按钮从左上角利用补间动画将其移动到右下角,在移动过程中和移动后,这个按钮都是不会响应点击事件的。这是为什么呢?因为补间动画仅仅转变的是控件的显示位置而已,并没有改变控件本身的值。View Animation的动画实现是通过其Parent View实现的,在View被drawn时Parents View改变它的绘制参数,这样虽然View的大小或旋转角度等改变了,但View的实际属性没变,所以有效区域还是应用动画之前的区域;我们看到的效果仅仅是系统作用在按钮上的显示效果,利用动画把按钮从原来的位置移到了右下角,但按钮内部的任何值是没有变化的,所以按钮所捕捉的点击区域仍是原来的点击区域。(下面会举例来说明这个问题)
这就得到了第三点不同:补间动画虽能对控件做动画,但并没有改变控件内部的属性值。而Property Animator则是恰恰相反,Property Animator是通过改变控件内部的属性值来达到动画效果的
我们前面讲了Property Animator包括ValueAnimator和ObjectAnimator;这篇文章就主要来看看ValueAnimator的使用方法吧。
我觉得谷歌那帮老头是最会起名字的人,单从命名上,就能看出来这个东东的含义。ValueAnimator从名字可以看出,这个Animation是针对值的! ValueAnimator不会对控件做任何操作,我们可以给它设定从哪个值运动到哪个值,通过监听这些值的渐变过程来自己操作控件。 它会自己计算动画的过程,然后我们需要监听它的动画过程来自己操作控件。
这就是ValueAnimator的功能:ValueAnimator对指定值区间做动画运算,我们通过对运算过程做监听来自己操作控件。
总而言之就是两点:
1. ValueAnimator只负责对指定的数字区间进行动画运算
2. 我们需要对运算过程进行监听,然后自己对控件做动画操作
插值器的意义其实就相当于物理公式中的加速度参数,所以这也就是它也叫加速器的原因。 如何自定义插值器:
**input参数与任何我们设定的值没关系,只与时间有关,随着时间的增长,动画的进度也自然的增加,input参数就代表了当前动画的进度。而返回值则表示动画的当前数值进度 **
在getInterpolation函数中,我们将进度反转过来,当传0的时候,我们让它数值进度在完成的位置,当完成的时候,我们让它在开始的位置
ObjectAnimator是派生自ValueAnimator的,所以ValueAnimator中所能使用的方法,在ObjectAnimator中都可以正常使用。ObjectAnimator重写了几个方法,比如ofInt(),ofFloat()等。利用ObjectAnimator重写的ofFloat方法如何实现一个动画:(改变透明度)
前面我们都是定义多个值,即至少两个值之间的变化,那如果我们只定义一个值呢,如下面的方式:(同样以MyPointView为例)
仅且仅当我们只给动画设置一个值时,程序才会调用属性对应的get函数来得到动画初始值。如果动画没有初始值,那么就会使用系统默认值。比如ofInt()中使用的参数类型是int类型的,而系统的Int值的默认值是0,所以动画就会从0运动到100;也就是系统虽然在找到不到属性对应的get函数时,会给出警告,但同时会用系统默认值做为动画初始值。
如果通过给自定义控件MyPointView设置了get函数,那么将会以get函数的返回值做为初始值。
根据 View setBackGroundColor() 方法可以自定义条用属性动画。
⑤ Android 中的动画有哪几类,它们的特点和区别是什么
1.View Animation(Tween Animation):补间动画,给出两个关键帧,通过一些算法将给定属性值在给定的时间内在两个关键帧间渐变。
View animation只能应用于View对象,而且只支持一部分属性,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化.
2.Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影补间动画和帧动画。
补间动画和Frame动画的定义:
所谓补间动画,是指通过指定View的初末状态和变化时间、方式,对View的内容完成一系列的图形变换来实现动画效果。主要包括四种效果:Alpha、Scale、Translate和Rotate。
帧动画就是Frame动画,即指定每一帧的内容和停留时间,然后播放动画。。
3.属性动画
只是一个动画效果,组件其实还在原来的位置上,xy没有改变
###位移:
第一个参数target指定要显示动画的组件
第二个参数propertyName指定要改变组件的哪个属性
第三个参数values是可变参数,就是赋予属性的新的值
传入0,代表x起始坐标:当前x + 0
传入100,代表x终点坐标:当前x + 100
//具有get、set方法的成员变量就称为属性
ObjectAnimator oa = ObjectAnimator.ofFloat(bt, "translationX", 0, 100) ;
4.四种基本的动画 ,透明/伸缩/移动/旋转。
(1)XML中
alpha 渐变透明度动画效果
scale 渐变尺寸伸缩动画效果
translate画面转换位置移动动画效果
rotate画面转移旋转动画效果
(2) javaCode中
AlphaAnimation渐变透明度动画效果
ScaleAnimation渐变尺寸伸缩动画效果
TranslateAnimation画面转换位置移动动画效果
RotateAnimation画面转移旋转动画效果
(3)Android动画模式
Animation主要有两种动画模式:
一种是tweened animation(渐变动画)
一种是frame by frame(画面转换动画)
Tween动画,这种实现方式可以使视图组件移动、放大、缩小以及产生透明度的变化;
Frame动画,传统的动画方法,通过顺序的播放排列好的图片来实现,类似电影。
⑥ Android 动画详解
android中酷炫的效果,都离不开动画的支持。这里我们详细介绍一下android中动画的分类。android的中动画分为帧动画、补间动画、属性动画。原理各不相同,实现的效果也大不相同。下面一一讲解三种动画。
帧动画顾名思义就是通过顺序一帧一帧播放图片从而产生动画效果,效果类似放电影。该动画缺点比较明显,就是如果图片过大过多会导致OOM。帧动画xml文件放置在drawable目录下而非anim文件夹下。
补间动画是通过对view进行旋转、缩放、渐变、透明度变化,而达到的一种动画效果。是一种渐进式动画。并且可以通过组合以上四种操作,完成复杂的自定义动画效果。缺点就是只是改变的view的展示状态,但是不会改变view的位置。例如我们将一个button通过位移想左移动100dp,然后停留在终点。但是我们可以发现展示的位置button点击无效果,不可以交互。而在button原始位置空白的地方点击会触发button的点击效果。也就是button本质还是在原来位置,只是展示左移了100dp。
透明度动画,通过改变view的透明度展示动画。对应AlphaAnimation和<alpha>xml标签
缩放动画,通过修改view的大小展示动画。对应ScaleAnimation类和<scale>xml表情
通过旋转view展示动画。对应RotateAnimation类和<rotate>xml标签
平移动画,更改view的展示位置展示动画。对应TranslateAnimation类和<translate>xml表情
应用动画xml配置
使用java类配置动画,具体参数类同xml参数,建议使用xml配置动画
属性动画本质是通过改变对象的属性(例如:x,y等属性),来实现动画的,所以基本上是无所不能的,只要对象有这个属性,就能实现动画效果。属性动画是在api11的新特性,通过动态的改变view的属性从而达到动画效果。虽然可以使用nineoldandroid库向下兼容,但是兼容本质是使用补间动画完成,也就是说不会更改view的属性,也不会更改view的位置。属性动画比较常用的类: ValueAnimator、ObjectAnimator、AnimationSet,其中ObjectAnimator是ValueAnimator的子类,而AnminationSet是动画集合
动画配置同样可以使用xml配置,参数类似,这里不做详细说明。
根据时间流逝百分比计算当前属性改变百分比。同xml配置动画中的 android:interpolator 属性配置,常见有LinearInterpolator(线性差值器)、(加速减速差值器)
等。自定义需要实现 Interpolator 或者 TimeInterpolator 。Interpolator接口继承TimeInterpolator。
根据当前属性改变百分比计算改变后的属性值。属性动画特有的属性。自定义估值器需要实现 TypeEvaluator 接口。
可以对任意属性做属性动画,属性动画要求动画作用的对象提供该属性的get()和set()方法。因为属性动画本质就是根据外界传递的对象属性的初始值和终点值,然后根据估值器和差值器计算属性值,不断调用属性的set方法,通过时间的推移所传递的值,越来越近终点值。
注意:
使用ValueAnimator通过监听动画过程,自己改变对象属性完成动画
⑦ android中的动画有哪几类
在Android3.0(即API Level11)以前,Android仅支持2种动画:分别是Frame Animation(逐帧动画)和Tween Animation(补间动画),在3.0之后Android支持了一种新的动画系统,称为:Property Animation(属性动画)。
一、Frame Animation:(逐帧动画)
这个很好理解,一帧帧的播放图片,利用人眼视觉残留原理,给我们带来动画的感觉。它的原理的GIF图片、电影播放原理一样。
1.定义逐帧动画比较简单,只要在中使用子元素定义所有播放帧即可。
(1) android:oneshot 设置是否仅播放一次
(2) android:drawable 设置每一帧图片
(3) android:ration 设置图片间切换间隔
2.习惯上把AnimationDrawable设置为ImageView的背景
android:background=@anim/frame_anim
然后我们就可以在java代码中获取AnimationDrawable对象了
AnimationDrawable anim = (AnimationDrawable)imageView.getBackground();
(需要注意的是,AnimationDrawable默认是不播放的,调用其start()方法开始播放,stop停止播放)
3.上面的动画文件是通过xml文件来配置的,如果你喜欢,也可以通过在java代码中创建AnimationDrawable对象,然后通过addFrame(Drawable frame, int ration)方法向动画添加帧,然后start()。。。
二、Tween Animation:(补间动画)
补间动画就是我们只需指定开始、结束的“关键帧“,而变化中的其他帧由系统来计算,不必自己一帧帧的去定义。
1. Android使用Animation代表抽象动画,包括四种子类:AlphaAnimation(透明度动画)、ScaleAnimation(缩放动画)、TranslateAnimation(位移动画)、RotateAnimation(透明度动画)。Android里面允许在java中创建Animation类对象,但是一般都会采用动画资源文件来定义动画,把界面与逻辑分离
<set android:interpolator="@android:anim/linear_interpolator" xmlns:android="http://schemas.android.com/apk/res/android">
<!-- 定义透明度的变换 -->
<!-- 定义旋转变换 -->
<rotate android:ration="3000/" android:fromdegrees="0" android:pivotx="50%" android:pivoty="50%" android:todegrees="1800">
</rotate></alpha></set>
(一个set可以同时定义多个动画,一起执行。)
2. android:interpolator=@android:anim/linear_interpolator控制动画期间需要补入多少帧,简单来说就是控制动画速度,有些地方翻译为“插值“。Interpolator有几种实现类:LinearInterpolator、AccelerateInterpolator、、CycleInterpolator、DecelerateInterpolator,具体使用可以参考官方API Demo。
3. 定义好anim文件后,我们可以通过AnimationUtils工具类来加载它们,加载成功后返回一个Animation。然后就可以通过View的startAnimation(anim)开始执行动画了。
Animation anim = AnimationUtils.loadAnimation(this, R.anim.anim);
//设置动画结束后保留结束状态
anim.setFillAfter(true);
//设置插值效果
anim.setInterpolator(interpolator);
//对view执行动画
view. startAnimation(anim);
三、Property Animation:(属性动画)
属性动画,这个是在Android 3.0中才引进的,它可以直接更改我们对象的属性。在上面提到的Tween Animation中,只是更改View的绘画效果而View的真实属性是不改变的。假设你用Tween动画将一个Button从左边移到右边,无论你怎么点击移动后的Button,他都没有反应。而当你点击移动前Button的位置时才有反应,因为Button的位置属性木有改变。而Property Animation则可以直接改变View对象的属性值,这样可以让我们少做一些处理工作,提高效率与代码的可读性。
(1)ValueAnimator:包含Property Animation动画的所有核心功能,如动画时间,开始、结束属性值,相应时间属性值计算方法等。应用ValueAnimator有两个步骤
1计算属性值。
2根据属性值执行相应的动作,如改变对象的某一属性。
我们的主是第二步,需要实现ValueAnimator.onUpdateListener接口,这个接口只有一个函数onAnimationUpdate(),将要改变View对象属性的事情在该接口中do。
animation.addUpdateListener(new AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
//do your work
}
});
(2)ObjectAnimator:继承自ValueAnimator,要指定一个对象及该对象的一个属性,当属性值计算完成时自动设置为该对象的相应属性,即完成了Property Animation的全部两步操作。实际应用中一般都会用ObjectAnimator来改变某一对象的某一属性,但用ObjectAnimator有一定的限制,要想使用ObjectAnimator,应该满足以下条件:
1.对象应该有一个setter函数:set(驼峰命名法)
2如下面的例子,像ofFloat之类的工场方法,第一个参数为对象名,第二个为属性名,后面的参数为可变参数,如果values…参数只设置了一个值的话,那么会假定为目的值,属性值的变化范围为当前值到目的值,为了获得当前值,该对象要有相应属性的getter方法:get
3如果有getter方法,其应返回值类型应与相应的setter方法的参数类型一致。
ObjectAnimator oa=ObjectAnimator.ofFloat(tv, alpha, 0f, 1f);
oa.setDuration(3000);
oa.start();
如果不满足上面的条件,我们只能乖乖的使用ValueAnimator来创建动画。
(3)Animator.AnimatorListener:可以为Animator设置动画监听,需要重写下面四个方法。
onAnimationStart()
onAnimationEnd()
onAnimationRepeat()
onAnimationCancel()
这里我们也可以实现AnimatorListenerAdapter,他的好处是可以只用定义想监听的事件而不用实现每个函数却只定义一空函数体。如下:
anim.addListener(new AnimatorListenerAdapter() {
public void on AnimationEnd(Animator animation){
//do your work
}
});
(4)AnimationSet:可以组合多个动画共同工作
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(anim1).before(anim2);
bouncer.play(anim2).with(anim3);
bouncer.play(anim2).with(anim4)
bouncer.play(anim5).after(amin2);
animatorSet.start();
上面的代码意思是: 首先播放anim1;同时播放anim2,anim3,anim4;最后播放anim5。
(5)TimeInterplator:与Tween中的interpolator类似。有以下几种
AccelerateInterpolator 加速,开始时慢中间加速
DecelerateInterpolator 减速,开始时快然后减速
先加速后减速,开始结束时慢,中间加速
AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放
反向加回弹,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值
BounceInterpolator 跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100
CycleIinterpolator 循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2 * mCycles * Math.PI * input)
LinearInterpolator 线性,线性均匀改变
OvershottInterpolator 回弹,最后超出目的值然后缓慢改变到目的值
TimeInterpolator 一个接口,允许你自定义interpolator,以上几个都是实现了这个接口
(6)Keyframes:可以让我们定义除了开始和结束以外的关键帧。KeyFrame是抽象类,要通过ofInt(),ofFloat(),ofObject()获得适当的KeyFrame,然后通过PropertyValuesHolder.ofKeyframe获得PropertyValuesHolder对象,如下:
Keyframe kf0 = Keyframe.ofInt(0, 400);
Keyframe kf1 = Keyframe.ofInt(0.25f, 200);
Keyframe kf2 = Keyframe.ofInt(0.5f, 400);
Keyframe kf4 = Keyframe.ofInt(0.75f, 100);
Keyframe kf3 = Keyframe.ofInt(1f, 500);
PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe(width, kf0, kf1, kf2, kf4, kf3);
ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(btn, pvhRotation);
上述代码的意思是:设置btn对象的width属性值使其:开始时 Width=400,动画开始1/4时 Width=200,动画开始1/2时 Width=400,动画开始3/4时 Width=100,动画结束时 Width=500。
(7)ViewPropertyAnimator:对一个View同时改变多种属性,非常推荐用这种。该类对多属性动画进行了优化,会合并一些invalidate()来减少刷新视图。而且使用起来非常简便,但是要求API LEVEL 12,即Android 3.1以上。仅需要一行代码即可完成水平、竖直移动
myView.animate().translationX(50f). translationY(100f);
(8)常需要改变的一些属性:
translationX,translationY: View相对于原始位置的偏移量
rotation,rotationX,rotationY: 旋转,rotation用于2D旋转角度,3D中用到后两个
scaleX,scaleY: 缩放比
x,y: View的最终坐标,是View的left,top位置加上translationX,translationY
alpha: 透明度
四、最后自己总结一下这三种动画的优缺点:
(1)Frame Animation(帧动画)主要用于播放一帧帧准备好的图片,类似GIF图片,优点是使用简单方便、缺点是需要事先准备好每一帧图片;
(2)Tween Animation(补间动画)仅需定义开始与结束的关键帧,而变化的中间帧由系统补上,优点是不用准备每一帧,缺点是只改变了对象绘制,而没有改变View本身属性。因此如果改变了按钮的位置,还是需要点击原来按钮所在位置才有效。
(3)Property Animation(属性动画)是3.0后推出的动画,优点是使用简单、降低实现的复杂度、直接更改对象的属性、几乎可适用于任何对象而仅非View类,缺点是需要3.0以上的API支持,限制较大!但是目前国外有个开源库,可以提供低版本支持!