【安卓笔记】NineOldAndroids动画兼容库的使用

功能介绍:

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有了更深入的理解了吧!

时间: 2024-10-29 16:43:41

【安卓笔记】NineOldAndroids动画兼容库的使用的相关文章

实现Android5.0过渡动画兼容库

Android5.0之后为我们提供了许多炫酷的界面过渡效果,其中共享元素过渡也是很有亮点的一个效果,但这个效果只能在Android5.0之后使用,那今天我们就来将共享元素过渡效果兼容到Android4.0,让5.0之前的手机也可以体验这么炫酷的效果吧. A transition animation compatible Library. 兼容Android5.0之后转场动画至Android4.0. github地址:https://github.com/zhangke3016/Translati

Android的材料设计兼容库(Design Support Library)

编辑推荐:稀土掘金,这是一个针对技术开发者的一个应用,你可以在掘金上获取最新最优质的技术干货,不仅仅是Android知识.前端.后端以至于产品和设计都有涉猎,想成为全栈工程师的朋友不要错过! 导读:这个兼容库很容易和之前的 Android Support Library 22.1混淆,都是兼容库,区别是这个库多了个Design. Android Support Library 22.1只是支持了一些基本控件的材料设计化,但是这个库更多的是对一些特效的实现,这个库和github上的很多开源项目是有

【转】Android的材料设计兼容库(Design Support Library)

转自:http://www.jcodecraeer.com/a/anzhuokaifa/developer/2015/0531/2958.html?mType=Group Android的材料设计兼容库(Design Support Library) 泡在网上的日子 发表于 2015-05-31 00:23 第 7641 次阅读 兼容包 1 导读:这个兼容库很容易和之前的 Android Support Library 22.1混淆,都是兼容库,区别是这个库多了个Design. Android

Android Material Design 兼容库的使用

Android Material Design 兼容库的使用 mecury 前言:近来学习了Android Material Design 兼容库,为了把这个弄懂,才有了这篇博客,这里先推荐两篇博客:1.Android Material Design 兼容库的使用详解2.Android应用Design Support Library完全使用实例第一篇博客是这个兼容库的详细解析,我参考了里面的许多内容,第二篇是兼容库的大致介绍,如果你能把这两篇全部弄懂,我这篇也没有必要看了.说了这么多,开始正文吧

Xamrin开发安卓笔记(三)

安装片 Xamrin开发安卓笔记(一) Xamrin开发安卓笔记(二) 这次记录的是滚动条跟sqlite创建.存储和读取. 先说滚动条相关,这个是比较简单的知识点. 当有一屏的东西需要填写的时候例如下图 我们都知道如果点击第一个文本框则会出现输入法.但是如果没有滚动条的话,只能依靠输入法中的回车一个一个的向下移动(虽然现在输入法都带自我关闭功能),很不友好,那么就需要滚动条,看了一下布局属性有滚动条,但是使用起来不好使.隐约想起来,安卓有滚动条控件,就在左边找了一下,果真找到这个玩意了.如下图

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器

C++ Primer 学习笔记_14_标准模板库_bitset位集合容器 bitset容器是一个bit位元素的序列容器,每个元素只占一个bit位,取值为0或1,因而很节省内存空间.下图是一个bitset的存储示意图,它的10个元素只使用了两个字节的空间. 使用bitset需要声明头文件"#include <bitset>" 1.创建bitset对象 创建bitset对象时,必须要指定容器的大小.bitset对象的大小一经定义,就不能修改了.下面这条语句就定义了bitset对

C++ Primer 学习笔记_23_标准模板库_stack.

C++ Primer 学习笔记_11_标准模板库_stack.queue队列容器与priority_queue优先队列容器 1.stack堆栈 stack堆栈是一个后进先出(Last In First Out,LIFO)的线性表,插入和删除元素都只能在表的一端进行.插入元素的一端称为栈顶,而另一端称为栈底.插入元素叫入栈(Push),删除元素叫出栈(Pop).下图是堆栈示意图 堆栈只提供入栈,出栈,栈顶元素访问和判断是否为空等几种方法.采用push()方法将元素入栈:采用pop()方法出栈:采用

[C++11笔记001]修改通用库中的XDynamicArray,使它可以支持C++11的初始化列表和for循环

今天,有空翻了一下<C++Primer plus(第六版)>,看到里面有介绍新的for循环和初始化列表,但是我实现的动态数组XDynamicArray不支持这些新特性,没办法,只好进行改造了. 首先是for循环,如下面的样式 for(auto e:stList) { cout<<e<<endl; } 是于就各种google,和查找C++11的array的源代码,总结:就是提供一个标准的iterator和begin,end这两个方法,就可以了. 是于定义了一个iterat

【安卓笔记】抽屉式布局----DrawerLayout

效果如下: DrawerLayout来自support.v4包,所以不用考虑兼容性问题.其次,这种布局类似风靡一时的侧滑菜单,但是比侧滑菜单轻巧许多. 下面介绍这种布局的使用方式. 1.在你的项目中导入support.v4包. 2.编辑一个布局,根节点为android.support.v4.widget.DrawerLayout,此节点下只允许有两个子节点,第一个为将来主页面的内容,第二个节点即为"抽屉"内容,通常是一个ListView.比如: <android.support.