NineOldAndroids动画兼容库的使用
2015-05-07 09:55
281 查看
【安卓笔记】NineOldAndroids动画兼容库的使用
时间:2014-12-31 13:02来源:网络整理 作者:赵红霞 点击: 244次
原文:http://94it.net/a/jingxuanboke/2014/1231/438006.html
功能介绍:NineOldAndroids是github上的一个开源项目,其作用是为了在低版本android上(API11以下)使用属性动画。它的原
功能介绍: NineOldAndroids是github上的一个开源项目,其作用是为了在低版本android上(API11以下)使用属性动画。它的原理其实也很简单,主要就是判断当前sdk版本,如果大于API11,那么就调用官方的API,否则自己实现动画效果。另外,在API使用方面,它与官方的属性动画基本一致。比如ObjectAnimator、ValueAnimator等等。 一.基本使用 跟官方类似,NineOldAndroids主要是通过ObjectAnimator、ValueAnimator、AnimatorSet完成属性动画。 示例代码: 1.ObjectAnimator: 让按钮水平向右移动100单位 Button btn = ... ObjectAnimator.ofFloat(btn,"translationX",100).setDuration(2000).start(); 2.ValueAnimator: 让按钮竖直向下移动100单位 Button btn = ... ValueAnimator animator = ValueAnimator.ofFloat(0,100).setDuration(2000); animator.start(); animator.addUpdateListener(new AnimatorUpdateListener() { @Override public void onAnimationUpdate(ValueAnimator animation) { float curVal = (float) animation.getAnimatedValue(); ViewHelper.setTranslationY(btn,curVal);//注意不要使用btn.setTranslationY } }); 大家应该注意到这里我们使用了一个新的类,叫ViewHelper,这个类是为了兼容以前的api,因为像setAlpha,setTranslationX等方法在低版本中是没有的,所以NineOldAndroids提供了ViewHelper类,使得我们不必关心API版本。 3.AnimatorSet: 水平移动100,竖直移动100,并且透明度发生改变。 Button btn =... AnimatorSet set = new AnimatorSet(); set.playTogether( ObjectAnimator.ofFloat(btn,"translationX",100), ObjectAnimator.ofFloat(btn,"translationY",100), ObjectAnimator.ofInt(btn,"alpha",1,0) ); set.setDuration(2000); set.start();当然了,这个效果也可以通过PropertyValuesHolder来实现:Button btn = ... ObjectAnimator.ofPropertyValuesHolder(btn, PropertyValuesHolder.ofFloat("translationX",100), PropertyValuesHolder.ofFloat("translationY",100), PropertyValuesHolder.ofInt("alpha",1,0) ).start(); 4.ViewPropertyAnimator: 我们知道,官方提供了ViewPropertyAnimator类简化了View动画,只要我们调用View提供的animate方法即可返回ViewPropertyAnimator实例,然后我们可以调用其x、translationX、alpha、rotation等方法很方便的实现动画。 NineOldAndroids库也提供了ViewPropertyAnimator类,但是使用方式上有点不一样。它是通过ViewPropertyAnimator提供静态工厂方法animate,并且在参数中必须绑定一个view,然后返回ViewPropertyAnimator实例。 示例代码: Button btn = ... ViewPropertyAnimator.animate(btn).translationX(100).translationY(100); 注:以上示例中使用的类应该全部导入nineoldandroids包中的! 二.ViewHelper类原理 ViewHelper提供了一系列静态set/get方法去操作View的各种属性,比如透明度、偏移量、旋转角度等等,这大大方便了我们的使用,并且有个好处就是不用考虑低版本的兼容性问题。那么ViewHelper是如何做到的呢?下面我们简单剖析下原理。 打开ViewHelper类源码,我们随便找一个方法,比如setAlpha方法: public static void setAlpha(View view, float alpha) { if (NEEDS_PROXY) { wrap(view).setAlpha(alpha); } else { Honeycomb.setAlpha(view, alpha); } } 这个方法内部有个判断,如果需要代理的话,那么就调用代理类的setAlpha方法,否则直接调用HoneyComb的setAlpha方法。这个NEEDS_PROXY是AnimatorProxy中的常量: public static final boolean NEEDS_PROXY = Integer.valueOf(Build.VERSION.SDK).intValue() < Build.VERSION_CODES.HONEYCOMB;判断当前sdk版本是否是API11以下,如果是的话那么NEEDS_PROXY为true。这时候会进入if分支,调用AnimatorProxy类中的wrap方法,将view进行包装,然后调用setAlpha方法设置透明度:public void setAlpha(float alpha) { if (mAlpha != alpha) { mAlpha = alpha; View view = mView.get(); if (view != null) { view.invalidate(); } } }可以看到这个方法会设置mAlpha变量,并调用invalidate方法刷新视图,刷新过程中,会调用applyTransformation方法更新透明度。@Override protected void applyTransformation(float interpolatedTime, Transformation t) { //setAlpha方法会导致view.invalidate刷新,而在刷新过程中,会回调此方法设置透明度 View view = mView.get(); if (view != null) { t.setAlpha(mAlpha); transformMatrix(t.getMatrix(), view); } }之所以这样做,是因为低版本没有提供setAlpha方法。如果sdk版本大于11,那么进入else分支,调用HoneyComb.setAlpha: static void setAlpha(View view, float alpha) { view.setAlpha(alpha); } 其他方法都跟这个类似。 通过上面分析相信大家对NineOldAndroids有了更深入的理解了吧! |
相关文章推荐
- 【安卓笔记】NineOldAndroids动画兼容库的使用
- NineOldAndroids动画兼容库的使用-ViewHelper
- 关于github上开源nineoldandroids兼容动画的笔记
- nineoldandroids动画开源框架的使用
- Android动画进阶—使用开源动画库nineoldandroids
- Android动画进阶—使用开源动画库nineoldandroids
- 关于github上开源nineoldandroids兼容动画的笔记
- Android动画进阶—使用开源动画库nineoldandroids
- Android动画进阶—使用开源动画库nineoldandroids
- 第三方开源库:nineoldandroids右弹出有动画
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android 之nineoldandroids ViewHelper实现动画效果
- 出场、入场动画大全,基于NineOldAndroids轻松实现动画效果
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- Android_开源框架_NineOldAndroids动画库
- NineOldAndroids在低版本系统的使用中点击事件滞留在原来位置的处理
- Android 使用NineOldAndroids实现绚丽的ListView左右滑动删除Item效果
- android 在使用ViewAnimationUtils.createCircularReveal()无法兼容低版本的情况下,另行实现圆形scale动画