3.0引入的属性动画相比之前的帧动画及补间动画做出了很大的设计上的突破,功能更加强大,结构上更加松耦合。在设计上很值得我们去学习。

做了这么几层抽象

第一层:任何View的动画都可以抽象成对View某种属性值的改变。

 ObjectAnimator colorAnim = ObjectAnimator.ofArgb(ballView, "color", Color.BLUE, Color.RED, Color.YELLOW);

如上,只需要保证View存在setColor的接口,那么就可以通过colorAnim来动态改变View的颜色。这也是属性动画名称的由来。

优点是:

干净彻底的实现了View和动画功能的解耦,从此view不知有动画,不用专门对外提供startAnimation方法的实现了,只用对外公开属性接口即可。

代表是:

ObjectAnimator

NOTE:如上setter方法的参数类型要和Animator中的设置的参数类型保持一致,否则会动画便没有效果

第二层:任何属性值的改变都可以抽象成为数学公式:

currentValue = startValue + fraction * (endValue - startValue)

如果是属性值类型是基本数据类型,我们是接触不到这一层的,Animator会帮助我们处理,但如果属性值类型是一个自定义数据类型,那么我们就需要通过实现接口TypeEvaluator来自行处理,这里我们就需要使用到上面的公式。
如下:属性值类型是一个坐标点对象。

public class SinPointTypeEvaluator implements TypeEvaluator {@Overridepublic Object evaluate(float fraction, Object startValue, Object endValue) {BallPoint start = (BallPoint) startValue;BallPoint end = (BallPoint) endValue;BallPoint newPoint = new BallPoint();newPoint.x = start.x + fraction * (end.x - start.x);newPoint.y = (float) (Math.sin(newPoint.x * Math.PI / 180) * 100) + end.y;return newPoint;}
}

fraction是比例值,由0到1的变化。

第三层:根据插值器,duration来计算比例值:fraction

根据插值器,时间duration 在动画执行后,随着时间的变化实时的对外通知fraction的变化。这是动画最核心逻辑实现.

实例

要实现如下的这个动画

首先是个球状View.我们要控制的属性有:

  • 球体直径
  • 球体颜色
  • 球体位置

定义View,公开属性方法

public class BallView extends View {/*** 球的颜色*/private int color;/*** 球的直径*/private int radius;/*** 球的位置*/private BallPoint point;public BallView(Context context) {super(context);}public BallView(Context context, AttributeSet attrs) {super(context, attrs);}public BallView(Context context, AttributeSet attrs, int defStyleAttr) {super(context, attrs, defStyleAttr);}public BallView(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {super(context, attrs, defStyleAttr, defStyleRes);}public int getColor() {return color;}public BallView setColor(int color) {this.color = color;return this;}public int getRadius() {return radius;}public BallView setRadius(int radius) {this.radius = radius;invalidate();return this;}public BallPoint getPoint() {return point;}public BallView setPoint(BallPoint point) {this.point = point;return this;}@Overrideprotected void onDraw(Canvas canvas) {super.onDraw(canvas);Paint paint = new Paint();paint.setColor(color);float x = 0;float y = 500;if (point != null) {x = point.x;y = point.y;}canvas.drawCircle(x, y, radius, paint);}
}

实现关于位置的TypeEvaluator

public class SinPointTypeEvaluator implements TypeEvaluator {@Overridepublic Object evaluate(float fraction, Object startValue, Object endValue) {BallPoint start = (BallPoint) startValue;BallPoint end = (BallPoint) endValue;BallPoint newPoint = new BallPoint();newPoint.x = start.x + fraction * (end.x - start.x);newPoint.y = (float) (Math.sin(newPoint.x * Math.PI / 180) * 100) + end.y;return newPoint;}
}

启动动画

        BallView ballView = new BallView(this);ObjectAnimator colorAnim = ObjectAnimator.ofArgb(ballView, "color", Color.BLUE, Color.RED, Color.YELLOW);colorAnim.setRepeatMode(ValueAnimator.REVERSE);colorAnim.setRepeatCount(ValueAnimator.INFINITE);ObjectAnimator radiusAnim = ObjectAnimator.ofInt(ballView, "radius", 10, 20, 30, 20, 10);radiusAnim.setRepeatMode(ValueAnimator.REVERSE);radiusAnim.setRepeatCount(ValueAnimator.INFINITE);ObjectAnimator pointAnim = ObjectAnimator.ofObject(ballView, "point", new SinPointTypeEvaluator(), new BallPoint(0, 300), new BallPoint(500, 300));pointAnim.setRepeatMode(ValueAnimator.REVERSE);pointAnim.setRepeatCount(ValueAnimator.INFINITE);AnimatorSet animatorSet = new AnimatorSet();animatorSet.setDuration(3000);animatorSet.playTogether(colorAnim, radiusAnim, pointAnim);animatorSet.start();

参考:

Android 动画总结
动画的其他基础知识

【Android基础】从属性动画看代码设计的艺术相关推荐

  1. 【Android基础】动画

    Android里的动画分为两类,以3.0版本为分水岭. 3.0前已存在 帧动画 补间动画 3.0出现 属性动画 帧动画 顾名思义,快速切换几张图片来达到动画的效果. 建立帧动画xml Note:不要把 ...

  2. kotlin+android+基础,kotlin-android动画基础篇

    因为最近在学习自定义view,所以开始也对动画需要了解下,废话不多说. 动画分为视图动画和属性动画,视图动画需要设计提供图片才可以完成,所以限制性较大,但是属性动画就可以对控件进行属性控制,可以实现更 ...

  3. android 仿ios动画效果代码,Android仿IOS上拉下拉弹性效果的实例代码

    用过iphone的朋友相信都体验过页面上拉下拉有一个弹性的效果,使用起来用户体验很好:Android并没有给我们封装这样一个效果,我们来看下在Android里如何实现这个效果.先看效果,感觉有些时候还 ...

  4. android 背景切换动画效果代码,关于Android shape gradient背景渐变

    百度后,发现渐变色不仅可以根据xml来实现,也可以用java代码来实现,由于目前没有那么多时间,只记录xml实现的方法:以后在记录Java实现的代码. 通过Shape gradient标签来实现 首先 ...

  5. android 背景切换动画效果代码,在Android应用中以模糊效果设置背景图片

    我试图使列表视图上的背景图像模糊,但是我尝试按照教程进行操作,但它不起作用.任何人都请指教,谢谢. 主要活动 public class IngredientCategoryMain extends A ...

  6. Android10处理Android字样开机动画翻转一次的问题

    文章目录 一.背景说明 二.分析及解决 1.检查persist.panel.orientation 2.代码分析 3.措施验证 总结 一.背景说明 系统版本:Android 10(Q) 厂商:高通 问 ...

  7. Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路...

     Android版网易云音乐唱片机唱片磁盘旋转及唱片机机械臂动画关键代码实现思路 先看一看我的代码运行结果. 代码运行起来初始化状态: 点击开始按钮,唱片机的机械臂匀速接近唱片磁盘,同时唱片磁盘也 ...

  8. 基于Android移动终端的微型餐饮管理系统的设计与实现4——Android基础

    本章将介绍一些在开发中用到的一些常用且值得介绍的Android 基础知识和技术,包括Fragment.Slidingmenu.RecyelerView.HelloCharts框架和Ormlite框架. ...

  9. Android基础入门教程——1.7 界面原型设计

    Android基础入门教程--1.7 界面原型设计 标签(空格分隔): Android基础入门教程 本节引言: 引用锤子科技视觉设计总监--罗子雄在重庆TEDx活动上说的一小段话: 每当我们看到一些美 ...

最新文章

  1. 进制转换converse
  2. Struts2的OGNL
  3. python适用场景_你真的了解Python吗?什么场景使用多线程,什么场景使用多进程?...
  4. 敏捷DoD完成定义的多种形态
  5. oracle常用操作指令
  6. 虽然在修行初期的飞鸽传书
  7. P2617 Dynamic Rankings(主席树+树状数组)
  8. 你的Android应用完全不需要那么多的权限
  9. 诗歌rails之Hacking ActiveRecord
  10. jQuery学习之DOM操作
  11. C语言习题5.21--学生成绩的处理
  12. SpringCloud从0到丧心病狂
  13. 企业IP地址管理(IPAM)
  14. 【GANs】Generative Adversarial Nets
  15. 自定义水晶报表的外观
  16. 跨专业计算机研究生如何毕业论文,跨专业考研论文要求
  17. 微软正式发布.NET 6:号称迄今为止最快
  18. 【系统分析师之路】第十七章 多媒体基础知识(章节重点)
  19. 前端特效CSS样式樱花
  20. POJ Sudoku 数独填数(深搜)

热门文章

  1. 比较某两个时间的时间戳相等
  2. 【vue插件篇】vue-form-check 表单验证
  3. 开始测试React Native App(下篇)
  4. 【Interfacenavigation】用RecyclerView创建一个列表(4)
  5. 空调能窃听插座能放火?物联网成了“危”联网
  6. Web开发者用什么编辑器?
  7. find、sed、awk、grep命令总结
  8. java.io.IOException: Attempted read from closed stream. 异常,解决
  9. ipa 打包遇到的坑
  10. ECMAScript 6 一些有意思的特性