Android中动画之五属性动画高级用法三
一.概况
上一篇文章主要介绍了自定义估值器的用法,达到可以对任意类的任意属性进行动画处理的目的。而其中都是使用的默认插值器AccelerateDecelerateInterpolator,就是先加速后减速插值器。接下来我们看看插值器。
主要内容:插值器
差值器和估值器里面参数的关系
差值器的关键方法
float getInterpolation(float input);
估值器的关键方法
public T evaluate(float fraction, T startValue, T endValue)
差值器中参数input经过一定的数学运算得到float类型的数值是动画的完成度也就是估值器里面evaluate方法中的参数fraction。
二.系统自带差值器的使用
本篇文章是在上一篇的基础上,稍作改动从屏幕中间竖直向下移动。并将默认插值器替换为我们想要实验的插值器。
只需要改变ArgbAndPosView自定义View中的startAni。
如下
匀速差值器LinearInterpolator
private void startAni() {
//起点属性值
Pointer startP = new Pointer(getWidth()/2,RADIUS,0xffff0000);
//终点属性值
Pointer endP = new Pointer(getWidth()/2,getHeight()-RADIUS,0xff00ff00);
//对本自定义View的pointer属性进行动画处理,动画时间为4000毫秒,从startP到endP,插值器用的默认的
ObjectAnimator ani = ObjectAnimator.ofObject(this,"pointer",new PointerEvaluator(),startP, endP);
//设置插值器:线性插值器
ani.setInterpolator(new LinearInterpolator());
ani.setDuration(4000);
ani.start();
}
匀速插值器效果
加速差值器AccelerateInterpolator
只是将差值器更换掉
ani.setInterpolator(new AccelerateInterpolator());
看效果图
从中我们也可以清楚的看到效果。其他的在这里就不全部展示了,下面我们看差值器到底是个什么东东。
三.插值器分析和自定义插值器
3.1插值器分析
前面的Android中动画之三属性动画高级用法一中我们对差值器有了初步了解,这里我们直接看一下系统自带差值器的源码,看看里面是怎么工作的。
看一下LinearInterpolator
public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
public LinearInterpolator() {
}
...省略代码...
//关键方法:传入什么就原值返回
public float getInterpolation(float input) {
return input;
}
...省略代码...
}
看一下AccelerateInterpolator
下面是其中的关键代码,注意看注释
public class AccelerateInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {
//两个关键参数,可以认为是整个动画中扮演“速度”角色。而差值器返回的数值代表“完成度”角色
private final float mFactor;
private final double mDoubleFactor;
//无参构造方法,默认设置两个属性值
public AccelerateInterpolator() {
mFactor = 1.0f;
mDoubleFactor = 2.0;
}
//有参构造,传入“速度值”
public AccelerateInterpolator(float factor) {
mFactor = factor;
mDoubleFactor = 2 * mFactor;
}
...省略代码...
//根据“速度值”决定完成度计算方式。
public float getInterpolation(float input) {
if (mFactor == 1.0f) {
return input * input;
} else {
return (float)Math.pow(input, mDoubleFactor);
}
}
...省略代码...
}
注意
- 关键方法是getInterpolation,根据传入值计算出动画完成度值
- 不同差值器,采用不同的数学模型来计算完成度值,这个算法也正是产生不同差值器的关键。
3.2自定义插值器
从上面我们看到只要getInterpolation中的算法自己定义,就能完成简单的差值器的定义。这里就不给出具体的算法,要根据具体业务需求来制定需要的算法。
四.ViewPropertyAnimator的用法
属性动画针对的是任意类的任意属性,但是我们平时开发中主要操作的是View,如果只提供这些麻烦的api那么就显得不够人性化了。于是在3.1加入了ViewPropertyAnimator。
先看效果
很简单就是一个平移加拉伸。
下面是关键代码
private void initView() {
showTv = (TextView) findViewById(R.id.show_tv);
//关键代码
showTv.animate().translationX(300).scaleX(2).setDuration(4000);
}
从上面我们可以知道
- ViewPropertyAnimator由View的animate方法产生
- 每个连续方法都返回ViewPropertyAnimator的实例
- 可以以连续调用方式获取组合动画
- 不必显示调用start方法
虽然使用这种方式可以实现和上面使用ValueAnimator和ObjectAnimator一样的效果,但是我更愿意使用上面的ValueAnimator和ObjectAnimator,更加灵活可扩展,当然这个看个人喜好。
五.总结
Android中动画使用时候注意的问题。
- OOM问题,主要是帧动画,图片过大造成的。
- 内存泄漏,属性动画中存在无限循环的情况,此类动画在Activity退出时候应该及时停止,否则造成Activity无法释放造成内存泄漏;通过验证后发现View动画并不存在这个问题。
- 兼容性问题,动画在3.0以下版本存在兼容性问题。属性动画在3.0以后新加的,即使有兼容包提供兼容方案,也只是表面现象一样,实质还是View动画。
下一篇: Selenium 爬取百度图片
推荐阅读
-
Android自定义view Path 的高级用法之搜索按钮动画
-
Android属性动画Property Animation系列三之LayoutTransition(布局容器动画)_html/css_WEB-ITnose
-
Android中动画之五属性动画高级用法三
-
Android中动画之四属性动画高级用法二
-
Android中动画之三属性动画高级用法一
-
android动画三(ValueAnimator和ObjectAnimator的高级用法).md
-
Android中属性动画的基本用法
-
Android中属性动画的基本用法(总结)
-
Android属性动画Property Animation系列三之LayoutTransition(布局容器动画)_html/css_WEB-ITnose