1.介绍


Android3.0推出了全新的AnimationAPI,使用起来很方便,但是不能在3.0以下版本使用,NineOldAndroids是一个可以在任意Android版本上使用的AnimationAPI,API和Android3.0中的类似。

2.常用类

  • ObjectAnimator
  • ValueAnimator
  • AnimatorSet
  • ViewPropertyAnimator

类名与官方的API是对应的,只是包名为com.nineoldandroids.animation


3.使用方法

首先导入NineOldAndroids的jar包。在Android3.0中,View中有一个animate方法,NineOldAndroids中提供了ViewPropertyAnimator.animate(View)与其对应,可以选择静态导入。

// 官方API(3.0以上)mView.animate().setDuration(5000).rotationY(720).x(100).y(100).start();// NineOldAndroidsViewPropertyAnimator.animate(mView).setDuration(5000).rotationY(720).x(100).y(100).start();// 可以使用静态导入import static com.nineoldandroids.view.ViewPropertyAnimator.animate;// 直接调用animate方法animate(mView).setDuration(5000).rotationY(720).x(100).y(100).start();

使用链式编程设置各种属性参数,最终调用start()来启动动画,还可以调用setStartDelay()设置动画延迟启动。

可以设置动画的监听器,在动画开始、结束等时候加一些处理。

ViewPropertyAnimator.animate(mIView).setDuration(5000).rotationY(720).x(100).y(100).setListener(new AnimatorListenerAdapter() {@Overridepublic void onAnimationStart(Animator animation) {super.onAnimationStart(animation);// 动画开始}@Overridepublic void onAnimationCancel(Animator animation) {super.onAnimationCancel(animation);// 动画取消}@Overridepublic void onAnimationEnd(Animator animation) {super.onAnimationEnd(animation);// 动画结束}@Overridepublic void onAnimationRepeat(Animator animation) {super.onAnimationRepeat(animation);// 动画重复启动}}).start();

ViewPropertyAnimator对象提供了取消动画的方法

ViewPropertyAnimator animate = ViewPropertyAnimator.animate(mDropTv);/* ... */animate.start();// 开始动画animate.cancel();// 取消动画

简单的动画效果使用ViewPropertyAnimator一般可以满足,下面介绍一下高级玩法。核心是ObjectAnimator类。

4.举例

背景颜色从红色到蓝色,并反转回去,而且无限重复。
ValueAnimator colorAnim = ObjectAnimator.ofInt(mView, "backgroundColor", /*红色*/0xFFFF8080, /*蓝色*/0xFF8080FF);colorAnim.setDuration(3000);colorAnim.setEvaluator(new ArgbEvaluator());// ARGBcolorAnim.setRepeatCount(ValueAnimator.INFINITE);   // 无限重复colorAnim.setRepeatMode(ValueAnimator.REVERSE); // 反转回去colorAnim.start(景颜色从红色到蓝色,而且无限重复。
AnimatorSet set = new AnimatorSet();set.playTogether(    ObjectAnimator.ofFloat(myView, "rotationX", 0, 360),    ObjectAnimator.ofFloat(myView, "rotationY", 0, 180),    ObjectAnimator.ofFloat(myView, "rotation", 0, -90),    ObjectAnimator.ofFloat(myView, "translationX", 0, 90),    ObjectAnimator.ofFloat(myView, "translationY", 0, 90),    ObjectAnimator.ofFloat(myView, "scaleX", 1, 1.5f),    ObjectAnimator.ofFloat(myView, "scaleY", 1, 0.5f),    ObjectAnimator.ofFloat(myView, "alpha", 1, 0.25f, 1));set.setDuration(5 * 1000).start();

使用动画集合AnimatorSet,可以使用多个ObjectAnimator,实现复杂的动画效果。

AnimatorSet主要方法有两个,playSequentially是创建按顺序执行的动画,playTogether是创建同时执行的动画。

5.ObjectAnimator说明

ObjectAnimator是动画对象,通过ObjectAnimator提供的一系列of开头的静态方法创建。

创建一般需要传入三个参数

  • target,Object类型,可不是View哦
  • PropertyName,String类型或Property类型,用于描述target中的属性
  • 数组,ofInt()就是int数组

ObjectAnimator原理是这样的:会调用targetset方法,设置PropertyName的值,这个值的计算方式是,根据Duration时长和第三个参数数组来计算出来当前时间的值。然后调用set方法设置进去。例如上面更改背景颜色的实例,PropertyNamebackgroundColor,数组是两个颜色值,运行动画就会根据Duration计算当前的颜色值,调用targetsetBackgroundColor方法设置进去,从而改变了背景颜色。

再看改AnimatorSet的实例,PropertyNamerotationXtranslationX之类的,这几个属性是在Android3.0以上才有的,所以调用set方法会出错的,通过观察ObjectAnimator,发现对这几个属性做了特殊处理,提前预制了这几个属性值。

static {        PROXY_PROPERTIES.put("alpha", PreHoneycombCompat.ALPHA);        PROXY_PROPERTIES.put("pivotX", PreHoneycombCompat.PIVOT_X);        PROXY_PROPERTIES.put("pivotY", PreHoneycombCompat.PIVOT_Y);        PROXY_PROPERTIES.put("translationX", PreHoneycombCompat.TRANSLATION_X);        PROXY_PROPERTIES.put("translationY", PreHoneycombCompat.TRANSLATION_Y);        PROXY_PROPERTIES.put("rotation", PreHoneycombCompat.ROTATION);        PROXY_PROPERTIES.put("rotationX", PreHoneycombCompat.ROTATION_X);        PROXY_PROPERTIES.put("rotationY", PreHoneycombCompat.ROTATION_Y);        PROXY_PROPERTIES.put("scaleX", PreHoneycombCompat.SCALE_X);        PROXY_PROPERTIES.put("scaleY", PreHoneycombCompat.SCALE_Y);        PROXY_PROPERTIES.put("scrollX", PreHoneycombCompat.SCROLL_X);        PROXY_PROPERTIES.put("scrollY", PreHoneycombCompat.SCROLL_Y);        PROXY_PROPERTIES.put("x", PreHoneycombCompat.X);        PROXY_PROPERTIES.put("y", PreHoneycombCompat.Y);    }

6.总结

NineOldAndroids的API与官方的API基本一致,使用很方便。能够轻松实现各种酷炫动画效果。

  • 一般情况使用ViewPropertyAnimator就可以了,可以设置动画监听器,实现连贯动画,和其他处理。
  • ObjectAnimator创建的targetObject,可以传入任何对象,原理是调用set方法,利用这个特性可以实现很多自定义的效果有点和Scroller类似。

7.参考

  • Github主页:https://github.com/JakeWharton/NineOldAndroids
  • 官方网站:http://nineoldandroids.com/
  • ListView动画库:https://github.com/nhaarman/ListViewAnimations
  • Android3.0 API:http://android-developers.blogspot.com/2011/02/animation-in-honeycomb.html
  • Android官方文档:http://developer.android.com/reference/android/view/animation/package-summary.html



更多相关文章

  1. Custom View
  2. android6.0以后删除HttpClient的解决方法
  3. logcat使用方法
  4. Error generating final archive: Debug Certificate expired on
  5. Android(安卓)C++中调用java
  6. Android(安卓)Audio代码分析7 - stream type
  7. android与h5之间的互调
  8. 解析Android中使用自定义字体的实现方法
  9. 关于Android中的四大组件(Activity)

随机推荐

  1. 2011.10.14(2)——— android 仿照微信的图
  2. Android 面试题集 & 答案,助你拿到心仪 Of
  3. Android操作HTTP实现与服务器通信
  4. 基于CentOS 6.4 使用Jenkins 进行Android
  5. Android主线程与子线程之沟通
  6. Android 异步加载图片分析
  7. Android(安卓)AIDL 双向调用的使用及相关
  8. Android[高级教程] 设计模式之七 单例模
  9. android测试框架
  10. Android开发5——文件读写