深入分析Android动画(二)
2024-08-27 11:31:05
上回书说到Android动画的分类以及基本使用,这会书主要说Android属性动画的原理,对于View动画的原理本篇不做深入分析。对于Android动画的基础请看深入分析Android动画(一)
我们先来看一个需求:要求对一个Button做动画,要求让其宽度从原始宽度增加到500px。这也太简单了,于是我们的主人公鸣人不假思索的写下了如下的代码
Button mButton = (Button) findViewById(R.id.button);
ObjectAnimator.ofInt(mButton,"width",500).setDuration(1000).start();
程序正常运行,借下来鸣人就分析了上述代码实现的原理,通过研究鸣人惊奇的发现了以下规则:
- 属性动画要求动画的作用对象提供该属性的get和set方法,
- 属性的改变必须通过某种方法反映出来,比如会带来UI的修改之类的
以上的条件缺一不可
这时鸣人又想到一个问题如果想要对一个对象的属性做动画,但是属性又没有对应的get和set方法怎么办呢??
通过研究发现有如下三种解决办法:
- 给你的对象加上get和set方法,如果你有权限的话。而这个方法对于Android SDK内部实现的类就不可行,这个方法是最简单的,但是往往是不可行的。
- 用一个类包装原始对象,间接为其提供get和set方法
- 采用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();
}
最新文章
- TableViewCell,TableView,UITableViewCell
- 玲珑杯1007-A 八进制大数加法(实现逻辑陷阱与题目套路)
- [zz] demand ,require ,request用法辨析
- MATLAB 编程风格指南及注意事项
- UVa 1515 (最小割) Pool construction
- Qt4.6.2已编译二进制版本在VS2005中的问题
- 高难度(1)常用的AR构架或库
- CF_402B 想法题
- HDU_2033——时间加法
- hdu1171 Big Event in HDU 01-背包
- C#DataTable学习心得
- 如何使用ssh-keygen生成key
- 【转】MAT(Memory Analyzer Tool)工具入门介绍
- angularjs执行流程
- web前端学习笔记
- okhttp +fastJson 在UI层的回调封装
- 微信小程序中发送模版消息注意事项
- J2EE进阶(十一)SSH框架整合常见问题汇总(二)
- 从fastjson多层泛型嵌套解析,看jdk泛型推断
- 四款让你绝对上瘾的手机APP 用一次就会爱不释手