android动画使用开源动画库nineoldandroids

冰糖葫芦三剑客 冰糖葫芦三剑客     2022-11-28     506

关键词:


       

     Android系统支持原生动画,这为应用开发者开发绚丽的界面提供了极大的方便,有时候动画是很必要的,当你想做一个滑动的特效的时候,如果苦思冥想都搞不定,那么你可以考虑下动画,说不定动画轻易就搞定了。下面再简单回顾下Android中的动画,本文后面会介绍一个稍微复杂点的动画,先上效果图


动画分类

View动画:也叫渐变动画,针对View的动画,主要支持平移、旋转、缩放、透明度

Drawable动画:也叫帧动画,主要是设置View的背景,可以以动画的形式为View设置多张背景

对象属性动画(Android3.0新加入):可以对对象的属性进行动画而不仅仅是View,动画默认时间间隔300ms,默认帧率10ms/帧。其可以达到的效果是:在一个时间间隔内完成对象从一个属性值到另一个属性值的改变,因此,属性动画几乎是无所不能的,只要对象有这个属性,它都能实现动画效果,但是属性动画从Android3.0才有,这就严重制约了属性动画的使用,这就是开源动画库nineoldandroids的作用,采用nineoldandroids,可以在3.0以前的系统上使用属性动画,nineoldandroids的网址是:http://nineoldandroids.com。说到属性动画,就不得不提到插值器(TimeInterpolator)和估值算法(TypeEvaluator),下面介绍。

TimeInterpolator和TypeEvaluator

TimeInterpolator中文翻译为时间插值器,它的作用是根据时间流逝的百分比来计算出当前属性值改变的百分比,系统预置的有LinearInterpolator(线性插值器:匀速动画)、AccelerateDecelerateInterpolator(加速减速插值器:动画两头慢中间快)和DecelerateInterpolator(减速插值器:动画越来越慢)等;TypeEvaluator的中文翻译为类型估值算法,它的作用是根据当前属性改变的百分比来计算改变后的属性值,系统预置的有IntEvaluator(针对整型属性)、FloatEvaluator(针对浮点型属性)和ArgbEvaluator(针对Color属性)。可能这么说还有点晦涩,没关系,下面给出一个实例就很好理解了。


看上述动画,很显然上述动画是一个匀速动画,其采用了线性插值器和整型估值算法,在40ms内,View的x属性实现从0到40的变换,由于动画的默认刷新率为10ms/帧,所以该动画将分5帧进行,我们来考虑第三帧(x=20 t=20ms),当时间t=20ms的时候,时间流逝的百分比是0.5 (20/40=0.5),意味这现在时间过了一半,那x应该改变多少呢,这个就由插值器和估值算法来确定。拿线性插值器来说,当时间流逝一半的时候,x的变换也应该是一半,即x的改变是0.5,为什么呢?因为它是线性插值器,是实现匀速动画的,下面看它的源码:

[java]  view plain  copy
  1. public class LinearInterpolator implements Interpolator   
  2.   
  3.     public LinearInterpolator()   
  4.       
  5.       
  6.     public LinearInterpolator(Context context, AttributeSet attrs)   
  7.       
  8.       
  9.     public float getInterpolation(float input)   
  10.         return input;  
  11.       
  12.   

很显然,线性插值器的返回值和输入值一样,因此插值器返回的值是0.5,这意味着x的改变是0.5,这个时候插值器的工作就完成了。

具体x变成了什么值,这个需要估值算法来确定,我们来看看整型估值算法的源码:

[java]  view plain  copy
  1. public class IntEvaluator implements TypeEvaluator<Integer>   
  2.   
  3.     public Integer evaluate(float fraction, Integer startValue, Integer endValue)   
  4.         int startInt = startValue;  
  5.         return (int)(startInt + fraction * (endValue - startInt));  
  6.       
  7.   

上述算法很简单,evaluate的三个参数分别表示:估值小数、开始值和结束值,对应于我们的例子就分别是:0.5,0,40。根据上述算法,整型估值返回给我们的结果是20,这就是(x=20 t=20ms)的由来。

说明:属性动画要求该属性有set方法和get方法(可选);插值器和估值算法除了系统提供的外,我们还可以自定义,实现方式也很简单,因为插值器和估值算法都是一个接口,且内部都只有一个方法,我们只要派生一个类实现接口就可以了,然后你就可以做出千奇百怪的动画效果。具体一点就是:自定义插值器需要实现Interpolator或者TimeInterpolator,自定义估值算法需要实现TypeEvaluator。还有就是如果你对其他类型(非int、float、color)做动画,你必须要自定义类型估值算法。

nineoldandroids介绍

其功能和android.animation.*中的类的功能完全一致,使用方法完全一样,只要我们用nineoldandroids来编写动画,就可以在所有的Android系统上运行。比较常用的几个动画类是:ValueAnimator、ObjectAnimator和AnimatorSet,其中ObjectAnimator继承自ValueAnimator,AnimatorSet是动画集,可以定义一组动画。使用起来也是及其简单的,下面举几个小栗子。

栗子1:改变一个对象(myObject)的 translationY属性,让其沿着Y轴向上平移一段距离:它的高度,该动画在默认时间内完成,动画的完成时间是可以定义的,想要更灵活的效果我们还可以定义插值器和估值算法,但是一般来说我们不需要自定义,系统已经预置了一些,能够满足常用的动画。

[java]  view plain  copy
  1. ObjectAnimator.ofFloat(myObject, "translationY", -myObject.getHeight()).start();  

栗子2:改变一个对象的背景色属性,典型的情形是改变View的背景色,下面的动画可以让背景色在3秒内实现从0xFFFF8080到0xFF8080FF的渐变,并且动画会无限循环而且会有反转的效果

[java]  view plain  copy
  1. ValueAnimator colorAnim = ObjectAnimator.ofInt(this"backgroundColor"/*Red*/0xFFFF8080/*Blue*/0xFF8080FF);  
  2. colorAnim.setDuration(3000);  
  3. colorAnim.setEvaluator(new ArgbEvaluator());  
  4. colorAnim.setRepeatCount(ValueAnimator.INFINITE);  
  5. colorAnim.setRepeatMode(ValueAnimator.REVERSE);  
  6. colorAnim.start();  

栗子3:动画集合,5秒内对View的旋转、平移、缩放和透明度都进行了改变

[java]  view plain  copy
  1. AnimatorSet set = new AnimatorSet();  
  2. set.playTogether(  
  3.     ObjectAnimator.ofFloat(myView, "rotationX"0360),  
  4.     ObjectAnimator.ofFloat(myView, "rotationY"0180),  
  5.     ObjectAnimator.ofFloat(myView, "rotation"0, -90),  
  6.     ObjectAnimator.ofFloat(myView, "translationX"090),  
  7.     ObjectAnimator.ofFloat(myView, "translationY"090),  
  8.     ObjectAnimator.ofFloat(myView, "scaleX"11.5f),  
  9.     ObjectAnimator.ofFloat(myView, "scaleY"10.5f),  
  10.     ObjectAnimator.ofFloat(myView, "alpha"10.25f, 1)  
  11. );  
  12. set.setDuration(5 * 1000).start();  

栗子4:下面是个简单的调用方式,其animate方法是nineoldandroids特有的

[java]  view plain  copy
  1. Button myButton = (Button)findViewById(R.id.myButton);  
  2.   
  3. //Note: in order to use the ViewPropertyAnimator like this add the following import:  
  4. //  import static com.nineoldandroids.view.ViewPropertyAnimator.animate;  
  5. animate(myButton).setDuration(2000).rotationYBy(720).x(100).y(100);  

栗子5:一个采用nineoldandroids实现的稍微复杂点的动画

布局xml如下:

[html]  view plain  copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"  
  3.     android:layout_width="match_parent"  
  4.     android:layout_height="match_parent" >  
  5.   
  6.     <Button  
  7.         android:id="@+id/menu"  
  8.         style="@style/MenuStyle"  
  9.         android:background="@drawable/menu" />  
  10.   
  11.     <Button  
  12.         android:id="@+id/item1"  
  13.         style="@style/MenuItemStyle"  
  14.         android:background="@drawable/circle1"  
  15.         android:visibility="gone" />  
  16.   
  17.     <Button  
  18.         android:id="@+id/item2"  
  19.         style="@style/MenuItemStyle"  
  20.         android:background="@drawable/circle2"  
  21.         android:visibility="gone" />查看详情

    animy.js,自己编写的功能丰富的html动画库

    近期由于项目须要。本人制作了一款js的动画插件。能够用于完毕各种js动画。比方移动、拉升、变色等等,全部动画经常使用的功能都已经实现,比方播放、暂停、停止、循环、加速、减速、反向播放、缓动、路径动画、锚点... 查看详情

    这样做动画交互,一点都不费力!(代码片段)

    ...区发表作者:paulzeng导语:Lottie是Airbnb开源的一个面向iOS、Android、ReactNative的动画库,可实现非常复杂的动画,使用也及其简单,极大释放人力,值得一试。一、简介Lottie是Airbnb开源的一个面向iOS、Android、ReactNative的动画库,能分... 查看详情

    css3常用动画+动画库

    animate.css是来自dropbox的工程师DanielEden开发的一款CSS3的动画效果小类库。包含了60多款不同类型的CSS3动画,包括:晃动,闪动,各种淡出淡出效果,如果你想快速的整合各种CSS3动画特效的话,使用它即可方便的实现。 查看演... 查看详情

    aos.js超赞页面滚动元素动画jquery动画库

    aos.js超赞页面滚动元素动画jQuery动画库插件描述:aos.js 是一款效果超赞的页面滚动元素动画jQuery动画库插件。该动画库可以在页面滚动时提供28种不同的元素动画效果,以及多种easing效果。在页面往回滚动时,元素会恢复到... 查看详情

    41vue使用第三方动画库(代码片段)

    [动画]如何在Vue中使用第三方动画库Animate.css阐述自定义动画选择方法一:给transition标签一个name方法二:自行制定CSS选择名称使用第三方动画库总结阐述这节我们一起学习一下,如何在Vue中使用第三方动画库Animate.css... 查看详情

    学习vue第十一节,使用使用其他动画库完成vue动画效果(代码片段)

    https://animate.style/  animate.css<!DOCTYPEhtml><html><head><metacharset="utf-8"><title></title><scriptsrc="lib/vue-2.4.0.js"type="text/javascript"cha 查看详情

    lottie,一个强大的移动端动画库

    ...好的理解。通过Gradle添加依赖dependenciescompile'com.airbnb.android:lottie:2.1.0'使用方式一:XML加载<com.airbnb.lottie.LottieAnimationViewandroid:id="@+id/animation_view"android:layout_width="wrap_content"android:layout_height=... 查看详情

    lottie,一个强大的移动端动画库

    ...好的理解。通过Gradle添加依赖dependenciescompile'com.airbnb.android:lottie:2.1.0'使用方式一:XML加载&l 查看详情

    第三方动画库使用方法

    第三方动画库的使用1.名字叫:animate.css2.封装了很多工作中常用的动画3.在使用第三方时候,需要加上animated类名首先https://daneden.github.io/animate.css/下载animate.csslink进head中第一种方法<divclass="myWorld">我的世界</div><style>.my... 查看详情

    Flex / Actionscript 中的文本动画库? [关闭]

    】Flex/Actionscript中的文本动画库?[关闭]【英文标题】:LibrariesfortextanimationinFlex/Actionscript?[closed]【发布时间】:2010-09-1609:29:24【问题描述】:是否有任何用于Actionscript(用于介绍屏幕或横幅)的酷文本动画效果库。我已经放弃尝... 查看详情

    uni-app引入css动画库

    引入Animate动画库Animate中文网地址:http://www.animate.net.cn/Animate下载地址:https://daneden.github.io/animate.css/下载Animate.css在app.vue中引入动画库使用动画库:animated+动画End! 查看详情

    你需要知道的15个很棒的css动画库

    从一种CSS样式配置到另一种的过渡可以使用CSS动画进行动画处理。描述CSS动画的样式和指示动画样式的开始和结束状态的一组关键帧,以及可能的中间路点,构成了动画。与传统的脚本驱动动画技术相比,CSS动画提供... 查看详情

    你需要知道的15个很棒的css动画库

    从一种CSS样式配置到另一种的过渡可以使用CSS动画进行动画处理。描述CSS动画的样式和指示动画样式的开始和结束状态的一组关键帧,以及可能的中间路点,构成了动画。与传统的脚本驱动动画技术相比,CSS动画提供... 查看详情

    velocity.js动画库使用

    ...赖jQuery,可单独使用。  2、兼容性可兼容到IE8和Android2.3。若需要兼容IE8,就必须引入jQuery1.x 3、示例代码(注意文件引用路径)(1)index.html<!DOCTYPEhtm 查看详情

    reactnative实现lottie动画(代码片段)

    Lottie是Airbnb开源的一个面向iOS、Android、ReactNative的动画库,能加载AdobeAfterEffects导出的动画,并且能让原生App像使用静态素材一样使用这些动画,完美实现炫酷的动画效果。使用流程上,Lottie动画需要先使用AdobeAfterEffects做出原... 查看详情

    自己整理的css3动画库,附下载链接

    动画调用语法animation:bounceIn0.3sease0.2s1both;按顺序解释参数:动画名称如:bounceIn一周期所用时间如:0.3s速度曲线如:ease值描述linear动画从头到尾的速度是相同的。ease默认。动画以低速开始,然后加快,在结束前变慢。ease-in动画... 查看详情

    封装android带lottie动画的底部导航栏(代码片段)

    什么是Lottie动画Lottie是Airbnb开源的一个面向iOS、Android、ReactNative的动画库,能分析AdobeAfterEffects导出的动画,并且能让原生App像使用静态素材一样使用这些动画,完美实现动画效果,动画效果比原生动画要优美很... 查看详情