1.介绍php
Android3.0推出了全新的AnimationAPI,使用起来很方便,可是不能在3.0如下版本使用,NineOldAndroids是一个能够在任意Android版本上使用的AnimationAPI,API和Android3.0中的相似。
html
类名与官方的API是对应的,只是包名为com.nineoldandroids.animation
。java
首先导入NineOldAndroids的jar包。在Android3.0中,View
中有一个animate
方法,NineOldAndroids中提供了ViewPropertyAnimator.animate(View)
与其对应,能够选择静态导入。android
// 官方API(3.0以上) mView.animate().setDuration(5000).rotationY(720).x(100).y(100).start(); // NineOldAndroids ViewPropertyAnimator.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()
设置动画延迟启动。git
能够设置动画的监听器,在动画开始、结束等时候加一些处理。github
ViewPropertyAnimator .animate(mIView) .setDuration(5000) .rotationY(720) .x(100).y(100) .setListener(new AnimatorListenerAdapter() { @Override public void onAnimationStart(Animator animation) { super.onAnimationStart(animation); // 动画开始 } @Override public void onAnimationCancel(Animator animation) { super.onAnimationCancel(animation); // 动画取消 } @Override public void onAnimationEnd(Animator animation) { super.onAnimationEnd(animation); // 动画结束 } @Override public void onAnimationRepeat(Animator animation) { super.onAnimationRepeat(animation); // 动画重复启动 } }).start();
ViewPropertyAnimator
对象提供了取消动画的方法编程
ViewPropertyAnimator animate = ViewPropertyAnimator.animate(mDropTv); /* ... */ animate.start(); // 开始动画 animate.cancel(); // 取消动画
简单的动画效果使用ViewPropertyAnimator
通常能够知足,下面介绍一下高级玩法。核心是ObjectAnimator
类。数组
ValueAnimator colorAnim = ObjectAnimator.ofInt(mView, "backgroundColor", /*红色*/0xFFFF8080, /*蓝色*/0xFF8080FF); colorAnim.setDuration(3000); colorAnim.setEvaluator(new ArgbEvaluator()); // ARGB colorAnim.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,实现复杂的动画效果。
ide
AnimatorSet
主要方法有两个,playSequentially
是建立按顺序执行的动画,playTogether
是建立同时执行的动画。动画
ObjectAnimator
是动画对象,经过ObjectAnimator提供的一系列of开头的静态方法建立。
建立通常须要传入三个参数
target
,Object类型,可不是View哦PropertyName
,String类型或Property类型,用于描述target中的属性ofInt()
就是int数组 ObjectAnimator
原理是这样的:会调用target
的set
方法,设置PropertyName
的值,这个值的计算方式是,根据Duration时长和第三个参数数组来计算出来当前时间的值。而后调用set
方法设置进去。例如上面更改背景颜色的实例,PropertyName
是backgroundColor
,数组是两个颜色值,运行动画就会根据Duration计算当前的颜色值,调用target
的setBackgroundColor
方法设置进去,从而改变了背景颜色。
再看改AnimatorSet
的实例,PropertyName
是rotationX
、translationX
之类的,这几个属性是在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); }
NineOldAndroids的API与官方的API基本一致,使用很方便。可以轻松实现各类酷炫动画效果。
ViewPropertyAnimator
就能够了,能够设置动画监听器,实现连贯动画,和其余处理。ObjectAnimator
建立的target
是Object
,能够传入任何对象,原理是调用set
方法,利用这个特性能够实现不少自定义的效果有点和Scroller
相似。