Android动画之三:Property Animation(上)

来完成这个Android动画系列,之前写了View AnimationDrawable Animation,接下来讲解三种动画中的最后一种,Property
Animation,这也是Android动画中最强大的一部分,同时也是相对最复杂的一部分。

Property Animation与Value Animation的区别

Property Animation翻译为属性动画,从Android3.0开始引入,相比与View Animation,官方更推荐开发者使用Property Animation。以下先讲解View Animation和Property Animation的区别:

1,View Animation只能对界面上可见的组件进行修改,而Property Animation除此之外还能修改一些不是界面上可见的组件,比如修改一个float类型的值。(刚开始我看到这点也觉得奇怪,不过确实它就是如此,后面会讲解怎么应用它到界面动画中)

2,View Animation通过动画效果改变一个组件时,其实只是在屏幕上另一个地方绘制,而组件的响应位置还是没改变,比如一个在屏幕左侧的按钮,通过View Animation移动到右侧,虽然在屏幕上看到按钮到了右侧了,但是你还是需要点击左侧原来的位置,按钮才会响应。

3,Proerty Animation能修改很多View Animation不能修改的View控件的属性,比如背景颜色。

接下来主要讲解Property Animation的用法,包含了ValueAnimator,ObjectAnimator和AnimatorSet.

ValueAnimator

先看如下代码

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();

animation.addUpdateListener(new AnimatorUpdateListener() {

	@Override
	public void onAnimationUpdate(ValueAnimator animation) {
		System.out.println("onAnimationUpdate = "
				+ animation.getAnimatedValue());

		//可以在这里更新UI
	}
});

从这个例子看以看出,让一个浮点数进行Property Animator的变化,有什么作用呢?你只需要使用addUpdateListener,然后再监听的onAnimationUpdate中,使用getAnimatedValue()获取更新值,然后你将该值使用于UI,并刷新界面。这样一来,浮点型的Property Animator的与界面动画效果就联系起来了。

上面的onAnimationUpdate与动画更新周期有关,每个周期调用一次。默认周期是10ms,但是其实这个得看系统的繁忙程度。

ValueAnimator除了可以作用于浮点型,也可以作用于整型。

ObjectAnimator

再来看看ObjectAnimator,t它使ValueAnimator的子类,ValueAnimator需要我们监听onAnimationUpdate来将变化的值应用于某个UI属性。而ObjectAnimation的不同之处在于,它能自动将变化的值应用于某个UI属性。比如下面这个例子。

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);
anim.setDuration(1000);
anim.start()

以上ObjectAnimator.ofFloat的四个参数,分别是作用的对象,以及作用的属性,起始值,目标值。其中作用的属性,必须在作用的对象中有一个setter方法。用ObjectAnimator,会自动将更新值应用于构造方法中声明的属性。

使用ObjectAnimator时需要注意以下几点:

1,当你想使用ObjectAnimator更新某个对象的某个属性,需要有一个该属性的setter方法,比如上面的“alpha”,则在foo对象所属的类中,需要有setAlpha方法,系统使用该方法将最新的变化值应用于UI属性。当使用ObjectAnimator改变某个属性,而且没有该属性的setter方法,则你可以这样做:

1),如果你有权限修改代码,则直接为该属性添加一个setter方法

2),使用一个包装类,在该类中为该属性增加一个setter方法,然后再方法中将接收到的值应用于该属性。

3),使用ValueAnimator。

2,如果在构造ObjectAnimator时,只提供了目标值,而没有起始值,则除了需要为属性提供setter方法,还需要提供getter方法。

再看下面一个小例子,使用ObjectAnimator改变字体颜色

ObjectAnimator colorAnim = ObjectAnimator.ofInt(tv, "textColor",0xff008271, Color.RED);
colorAnim.setDuration(4000);
colorAnim.setEvaluator(new ArgbEvaluator());
colorAnim.setRepeatCount(100);
colorAnim.start();

注意两个问题,第一个是,颜色值必须写成0xff008271这种,而不能写成只有6位的十六进制的颜色值。第二个是,这里需要设置TypeEvaluator,否则颜色变化将是一闪一闪的。从这里可以发现,TypeEvaluator的作用就是计算动画每次渐变的值,控制渐变效果,而ArgbEvaluator就是系统提供来处理颜色值变化的。后面会讲解怎么自定义TypeEvaluator。

AnimatorSet

使用AnimatorSet,能让多个动画同时进行,或者以前后顺序进行,也可以指定某个动画延迟某段时间后进行。可以看看官网给出的例子

AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();

关于动画的前后顺序,主要with,before,after三个方法,with,表示同时进行,before和after表示前后关系。从上面代码很容易发现,AnimatorSet中可以包含多个ObjectAnimator,而且可以包含AnimatorSet。

Animation Listeners

动画的Listener主要是在动画的一些关键时刻做一些操作,比如开始,结束,每一帧的刷新,重复等等时刻。动画主要有连个Listener,Animator.AnimatorListener以及ValueAnimator.AnimatorUpdateListener

Animator.AnimatorListener

主要提供了以下回调方法

  • onAnimationStart()
  • onAnimationEnd()
  • onAnimationRepeat()
  • onAnimationCancel() 动画取消时会回调该方法,也会回调onAnimationEnd()

该Listener提供这么多未实现的方法,如果你只需要实现其中一个方法,但是你只要继承AnimatorListener就得实现所有方法。为了避免这个问题,你可以选择继承AnimatorListenerAdapter,该adapter为上面的各个方法提供了一个空实现,继承该类,你只需要实现你想用的方法。

ValueAnimator.AnimatorUpdateListener

主要提供了onAnimationUpdate()回调方法,该方法在动画每一帧执行一次,主要应用于ValueAnimator

TypeEvaluator的原理

动画是每一帧更新,而动画一共分为多少帧,每一帧应该做出多少变化,这两个问题分别交给TimeInterpolator和TypeEvaluator,TimeInterpolator计算出每个帧在什么时刻,然后使用TypeEvaluator计算在各个帧需要对动画施加的属性做出多少改变。

由于Property Animation知识点太多,这篇博客先写到这里,在下一篇博客讲解其他知识。

时间: 2024-08-24 09:14:39

Android动画之三:Property Animation(上)的相关文章

Android 属性动画(Property Animation) 完全解析 (上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,不过只能支持简单的缩放.平移.旋转.透明度基本的动画,且有一定的局限性.比如:你希望View有一个颜色的切换动画:你希望可以使用3D旋转动画:你希望当动画停止时,View的

Android(java)学习笔记263:Android下的属性动画(Property Animation)

1. 属性动画(Property Animation)引入: 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系统在一开始的时候就给我们提供了两种实现动画效果的方式,逐帧动画(frame-by-frame animation)和补间动画(tweened animation). 逐帧动画的工作原理很简单,其实就是将一个完整的动画拆分成一张张单独的图片,然后再将它们连贯起来进行播放,类似于动画片的工作原理. 补间动画则是可以对View进行一系列的动画操作,包括淡入淡出.缩放.平移.

Android 属性动画(Property Animation) 完全解析 (下)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38092093 上一篇Android 属性动画(Property Animation) 完全解析 (上)已经基本展示了属性动画的核心用法: ObjectAnimator实现动画,ValueAnimator实现动画,AnimatorSet的使用等~ 当然了属性动画还有一部分的知识点,也能做出很不错的效果,将在本篇博客为您展示~ 1.如何使用xml文件来创建属性动画 大家肯定都清楚,

Android研究之属性动画(Property Animation)完全解析详解下

 上一篇Android研究之属性动画(Property Animation)完全解析详解上已经基本展示了属性动画的核心用法: ObjectAnimator实现动画,ValueAnimator实现动画,AnimatorSet的使用等~ 当然了属性动画还有一部分的知识点,也能做出很不错的效果,将在本篇博客为您展示~ 1.如何使用xml文件来创建属性动画 大家肯定都清楚,View Animator .Drawable Animator都可以在anim文件夹下创建动画,然后在程序中使用,甚至在The

通过AnimationSet 同步或一部播放多个动画 Android 属性动画(Property Animation) 完全解析 (下)

AnimationSet提供了一个把多个动画组合成一个组合的机制,并可设置组中动画的时序关系,如同时播放,顺序播放等. 以下例子同时应用5个动画: 播放anim1: 同时播放anim2,anim3,anim4: 播放anim5. AnimatorSet bouncer = new AnimatorSet(); bouncer.play(anim1).before(anim2); bouncer.play(anim2).with(anim3); bouncer.play(anim2).with(a

Android动画学习——Tween Animation

目录 目录 Android动画学习 Tween Animation scale动画调节尺寸 alpha动画调节透明度 rotate动画旋转 translate动画平移 Android动画学习 android中动画分为3种: Tween Animation:通过对场景里的对象不断做图像变换(平移.缩放.旋转)产生的动画效果,即是一种渐变动画. Frame Animation:顺序播放事先做好的图像,是一种画面转换动画. Property Animation:属性动画,通过动态地改变对象的属性从而达

【转】Android 属性动画(Property Animation) 完全解析 (上)

http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,不过只能支持简单的缩放.平移.旋转.透明度基本的动画,且有一定的局限性.比如:你希望View有一个颜色的切换动画:你希望可以使用3D旋转动画:你希望当动画停止时,View的位置就是当前的位

Android 属性动画(Property Animation) 全然解析 (上)

转载请标明出处:http://blog.csdn.net/lmj623565791/article/details/38067475 1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,只是仅仅能支持简单的缩放.平移.旋转.透明度主要的动画.且有一定的局限性. 比方:你希望View有一个颜色的切换动画.你希望能够使用3D旋转动画:你希望当动画停止时.Vie

Android 属性动画(Property Animation)

1.概述 Android提供了几种动画类型:View Animation .Drawable Animation .Property Animation .View Animation相当简单,不过只能支持简单的缩放.平移.旋转.透明度基本的动画,且有一定的局限性.比如:你希望View有一个颜色的切换动画:你希望可以使用3D旋转动画:你希望当动画停止时,View的位置就是当前的位置:这些View Animation都无法做到.这就是Property Animation产生的原因,本篇博客详细介绍