上回书说到Android动画的分类以及基本使用,这会书主要说Android属性动画的原理,对于View动画的原理本篇不做深入分析。对于Android动画的基础请看深入分析Android动画(一)

我们先来看一个需求:要求对一个Button做动画,要求让其宽度从原始宽度增加到500px。这也太简单了,于是我们的主人公鸣人不假思索的写下了如下的代码

 Button mButton = (Button) findViewById(R.id.button);
ObjectAnimator.ofInt(mButton,"width",500).setDuration(1000).start();

程序正常运行,借下来鸣人就分析了上述代码实现的原理,通过研究鸣人惊奇的发现了以下规则:

  1. 属性动画要求动画的作用对象提供该属性的get和set方法,
  2. 属性的改变必须通过某种方法反映出来,比如会带来UI的修改之类的

以上的条件缺一不可

这时鸣人又想到一个问题如果想要对一个对象的属性做动画,但是属性又没有对应的get和set方法怎么办呢??

通过研究发现有如下三种解决办法:

  1. 给你的对象加上get和set方法,如果你有权限的话。而这个方法对于Android SDK内部实现的类就不可行,这个方法是最简单的,但是往往是不可行的。
  2. 用一个类包装原始对象,间接为其提供get和set方法
  3. 采用ValueAnimator,监听动画过程,自己实现属性的改变

对于方法2和方法3下面给出例子,仍以上面Button的宽度动画作为需求

方法2:

 mButton = (Button) findViewById(R.id.button);
ObjectAnimator.ofInt(new ViewWrapper(mButton),"width",500).setDuration(1000).start(); private class ViewWrapper{
private View mTarget; public ViewWrapper(View mTarget) {
this.mTarget = mTarget;
} public int getWidth() {
return mTarget.getLayoutParams().width;
} public void setWidth(int width) {
mTarget.getLayoutParams().width = width;
mTarget.requestLayout();
}
}

方法3:

  

 mButton = (Button) findViewById(R.id.button);
performAnimate(mButton, mButton.getWidth(), 500); private void performAnimate(final View target, final int start, final int end) { ValueAnimator valueAnimator = ValueAnimator.ofInt(1, 100);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() { // 持有一个IntEvaluator对象,方便下面估值的时候使用
private IntEvaluator mEvaluator = new IntEvaluator(); @Override
public void onAnimationUpdate(ValueAnimator animator) {
// 获得当前动画的进度值,整型,1-100之间
int currentValue = (Integer) animator.getAnimatedValue();
Log.d(TAG, "current value: " + currentValue); // 获得当前进度占整个动画过程的比例,浮点型,0-1之间
float fraction = animator.getAnimatedFraction();
// 直接调用整型估值器通过比例计算出宽度,然后再设给Button
target.getLayoutParams().width = mEvaluator.evaluate(fraction, start, end);
target.requestLayout();
}
}); valueAnimator.setDuration(5000).start();
}

最新文章

  1. TableViewCell,TableView,UITableViewCell
  2. 玲珑杯1007-A 八进制大数加法(实现逻辑陷阱与题目套路)
  3. [zz] demand ,require ,request用法辨析
  4. MATLAB 编程风格指南及注意事项
  5. UVa 1515 (最小割) Pool construction
  6. Qt4.6.2已编译二进制版本在VS2005中的问题
  7. 高难度(1)常用的AR构架或库
  8. CF_402B 想法题
  9. HDU_2033——时间加法
  10. hdu1171 Big Event in HDU 01-背包
  11. C#DataTable学习心得
  12. 如何使用ssh-keygen生成key
  13. 【转】MAT(Memory Analyzer Tool)工具入门介绍
  14. angularjs执行流程
  15. web前端学习笔记
  16. okhttp +fastJson 在UI层的回调封装
  17. 微信小程序中发送模版消息注意事项
  18. J2EE进阶(十一)SSH框架整合常见问题汇总(二)
  19. 从fastjson多层泛型嵌套解析,看jdk泛型推断
  20. 四款让你绝对上瘾的手机APP 用一次就会爱不释手

热门文章

  1. Spring Boot Document Part II(下)
  2. 01背包java实现(入门到精通)
  3. hdu 5952 连通子图
  4. python爬取煎蛋网图片
  5. Mybatis,Spring,SpringMVC框架面试题
  6. 简述static关键字、void与void *(void指针)、函数指针
  7. 填个小坑,Vue不支持IE8及以下,跨域ajax不支持IE9
  8. Ubuntu15.04 网站服务器环境搭建,php/html/css等学习环境搭建教程
  9. angularJS的一点小笔记
  10. Struts2运行流程-源码剖析