Android之开源框架NineOldAndroids动画库

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();// 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()设置动画延迟启动。

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

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());	// 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,实现复杂的动画效果。

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



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294886.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

python keyerror not in index_python – 带有索引的Pandas Plot导致’KeyError []不在索引中...

我是Python中Pandas概念的新手.通常情节不是问题.但是,我现在面临的是包含索引的数据框.不知何故什么都没有了.我想要实现的目标:为每个列[Plant1,Plant2,Plant3]创建一个特定柱[Trafo1]的子图.这是我的代码:import numpy as npimport datetimeimport nu…

现在竟然还有补丝袜的?

1 看到柿子树千万不要踢(素材来源网络,侵删)▼2 原来上床下桌还能这么简陋(素材来源网络,侵删)▼3 你总是心太远心太远(via.炕上的卡夫卡)▼4 这个岗位的上一位同事离职原因▼5 …

位(bit)与字节(byte)

bit就是位,也叫比特位,是计算机表示数据最小的单位。 byte就是字节,1byte8bit,1byte就是1B; 一个字符2字节; 1KB1024B 一个英文字母,无论大写和小写都是一个字符:一个字节 1B 一个汉字是一个字符:两个字节…

微服务组件记事本:Skywalking的ES索引 · 收藏篇

(2021年倒计时33天)书接上文,在上回书中,我们说到了《微服务组件记事本:Skywalking执行效果 多图篇》,文章比较详细的展示了Skywalking中的各种数据和图表展示,有些小伙伴群里问我,…

【原创】SQL SERVER 查询Job作业基本信息及执行情况

查询作业基本信息和作业执行情况 SELECT[jop].[job_id] AS 作业唯一标识符,[jop].[ name ] AS 作业名称,[dp].[ name ] AS 作业创建者,[cat].[ name ] AS 作业类别,[jop].[description] AS 作业描述, CASE [jop].[enabled]WHEN 1 THEN 是WHEN 0 THEN 否END AS 是否启用,[jop].[…

Oracle %rowtype的用法

表示该类型为行数据类型,存储的是一行数据,一行数据里可以有多列,类似于表里的一行数据,也可以是游标里的一行数据,如:vs_row1 表%rowtype;vs_row2 游标%rowtype;

计算机游戏50关,YELLOW游戏全50关攻略

yellow游戏是一款比较休闲的游戏作品,这款游戏中需要通过变换将屏幕全部调整成黄色,虽然操作不难,但比较考验思维能力,下面是全50关通关攻略,大家可以参考参考。【注:以下为攻略,不想看的不用点…

Android之判断网络状态(网络的连接,改变,和判断2G/3G/4G)

现在app大多都需要从网络上获得数据。所以访问网络是在所难免。但是再访问网络之前,我们应该先做一下网络的状态判断。其实在访问网络之前我们要做一些状态判断,对应一些状态判断来做处理,并不是直接使用Http访问网络即可。很多人在开发就经常…

python达梦数据库_Python 编程可以访问达梦数据吗?

可以,但官方只给了python2.7版本的包,python3目前无法使用,此外达梦自己的linux客户端只支持redhat或者centos。请首先在系统安装达梦客户端,下载地址如下:具体流程如下:Linux下DM7与Python的适配方法1.概述…

2021年将迎接你的是什么?

1 2021年迎接你的是...(素材来源网络,侵删)▼2 原来帅真的可以当饭吃(素材来源网络,侵删)▼3 我的芒果千层到了吗?(素材来源网络,侵删)▼4 这个岗位的上一…

log4j:WARN No appenders could be found for logger

2019独角兽企业重金招聘Python工程师标准>>> 提示这个错误是因为log4j的环境没有配置的原因,在src目录下新建一个log4j.properties的文件,黏贴如下内容即可解决。 # Configure logging for testing: optionally with log file log4j.rootLog…

推荐Mongodb GUI 可视化管理工具-NoSQLBooster

工欲善其事,必先利其器。虽然 MongoDB 已经提供了默认的管理工具(CLI)Shell 命令行,但是每次登录时都需要做身份认证,切换数据库等等一系列繁琐的操作,时间久了还是挺闹心的。实际开发中,还是会…

使用string.Format需要注意的一个性能问题

今天,我在写C#代码时,突然发现一个最熟悉的陌生人 —— string.Format。在写C#代码的日子里,与它朝夕相伴,却没有真正去了解它。只知道在字符串比较多时,用它比用加号进行字符串连接效率更高(当然也更方便&…

hdu 3480 斜率dp

思路&#xff1a;很普通的斜率dp #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define Maxn 10010 #define LL int using namespace std; LL dp[Maxn][2],num[Maxn]; int que[Maxn*10]; inline LL getleft(int x,int …

angular的html引入js,在AngularJS中的文件夹中加载JavaScript和CSS文件

AngularJS不支持你想要的东西,但是你可以看看Grunt或Gulp等构建工具,它们可以让你“构建”你的应用程序.在您的情况下,这些工具可以查找CSS文件并将它们连接成一个文件.这样,如果您添加新模块,则index.html不必更改.我个人使用GulpJS,因为它看起来要快得多.我发现配置更容易&am…

Android之android.graphics.drawable.Drawable.Callback回调接口

[java] view plaincopy /*如果你想实现一个扩展子Drawable的动画drawable&#xff0c;那么你可以通过setCallBack(android.graphics.drawable.Drawable.Callback)来把你实现的该接口注册到动画drawable *中。可以实现对动画的调度和执行 */ public static interface Call…

为什么说,每个人都应该多读些书?

全世界只有3.14 % 的人关注了爆炸吧知识知乎上有个高赞问题&#xff1a;有哪些值得长期坚持下去就能改变人生的好习惯&#xff1f;其中最高频的回答是读书。随着经历和阅历的增加&#xff0c;越来越多的人清醒的认识到&#xff1a;读书不再是学生时代的事&#xff0c;而是一生的…

.Net Crank性能测试入门

Crank 是微软新出的一个性能测试框架&#xff0c;集成了多种基准测试工具&#xff0c;如bombardier、wrk等。Crank通过统一的配置&#xff0c;可以转换成不同基准测试工具命令进行测试。可参考Bombardier Job实现。安装Crank运行如下两个命令分别安装Crank的cli(Controller)和A…

兄弟机cnc系统面板图解_FANUC软操作面板的应用介绍,真的太详细了

FANUC软操作面板介绍&#xff1a;FANUC软操作面板功能是CNC系统软件的一项功能&#xff0c;可以利用MDI键盘上的光标移动按键和轴移动方向按键 代替机床操作面板的按钮&#xff0c;结合显示器的显示&#xff0c;实现与操作面板同样的功能。在CNC系统安装到机床上之前进行调试试…

个人项目耗时对比记录表

PSP2.1Personal Software Process StagesTime(%)Planning计划 Estimate 估计这个任务需要多少时间 Development开发 Analysis 需求分析 Design Spec 生成设计文档 Design Review 设计复审&#xff08;和同事审核设计文档&#xff09; Coding Standard 代码规范&#xff08…