前言:

前面初步认识了Android的Property Animation(属性动画)Android动画效果之初识Property Animation(属性动画)(三),并且利用属性动画简单了补间动画能够实现的动画效果,今天重点学习下Property Animation基本原理及高级使用。本章先通过余额宝的数字动画小例子来学习属性动画基本原理。具体效果如下:

其他几种动画效果:

ValueAnimator(差值动画)

上篇文章一直使用的ObjectAnimator来实现属性动画,单纯从字面上理解的话ObjectAnimator作用于某个实际的对象,而ValueAnimator是ObjectAnimator的父类,它继承自抽象类Animator,它作用于一个值,将其由一个值变化为另外一个值,然后根据值的变化,按照一定的规则,动态修改View的属性,比如View的位置、透明度、旋转角度、大小等,即可完成了动画的效果。直接看下上面的数字动画是怎么实现的?

ValueAnimator valueAnimator =ValueAnimator.ofFloat( 0f, 126512.36f);
valueAnimator.setDuration(2000);
valueAnimator.setInterpolator(new LinearInterpolator());
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float money= (float) animation.getAnimatedValue();
mTextView.setText(String.format("%.2f", money));
}
});
valueAnimator.start();

这里通过ofFloat()方法构造一个ValueAnimator实例,除此之外还提供了其他函数ofInt()、ofObject()、ofPropertyValuesHolder()函数,api 21之后又提供了ofArgb(),每个函数都是可以传入多个改变值。

Interpolator(插值器)

Interpolator插值器用于控制动画的变化速率,也可以简单的理解成用于控制动画的快慢,插值器目前都只是对动画执行过程的时间进行修饰,并没有对轨迹进行修饰。系统提供的插值器有以下几种:

插值器名字 解说 对应的xml
AccelerateInterpolator  加速,开始时慢中间加速  @android:anim/accelerate_interpolator
DecelerateInterpolator 减速,开始时快然后减速 @android:anim/decelerate_interpolator
AccelerateDecelerateInterolator   先加速后减速,开始结束时慢,中间加速  @android:anim/accelerate_decelerate_interpolator
AnticipateInterpolator 反向 ,先向相反方向改变一段再加速播放  @android:anim/anticipate_interpolator
AnticipateOvershootInterpolator 反向加超越,先向相反方向改变,再加速播放,会超出目的值然后缓慢移动至目的值 @android:anim/anticipate_overshoot_interpolator
BounceInterpolator  跳跃,快到目的值时值会跳跃,如目的值100,后面的值可能依次为85,77,70,80,90,100 @android:anim/bounce_interpolator
CycleIinterpolator  循环,动画循环一定次数,值的改变为一正弦函数:Math.sin(2* mCycles* Math.PI* input) @android:anim/cycle_interpolator
LinearInterpolator  线性,线性均匀改变 @android:anim/linear_interpolator
OvershootInterpolator 超越,最后超出目的值然后缓慢改变到目的值 @android:anim/overshoot_interpolator

通过上面的名字大家是不是很眼熟,是的和补间动画的插值器是一致的。Android的动画插值器采用策略设计模式,都是实现了Interpolator这个接口,而Interpolator又是继承自一个叫做TimeInterpolator的接口(从3.0开始,增加了TimeInterpolator这个接口,并把原先的Interpolator接口的抽象方法移到了其中,3.0后的Interpolator接口也就什么也没做,只是对父类改了个名字,达到向下兼容)。

package android.animation;

public interface TimeInterpolator {

    float getInterpolation(float input);
}

在Interpolator的实现类里面,都实现了一个float getInterpolator(float input)的方法,传入参数是正常执行动画的时间点,返回值是用户真正想要它执行的时间点。上面的数字动画使用了匀速插值器LinearInterpolator其代码实现如下:

public class LinearInterpolator extends BaseInterpolator implements NativeInterpolatorFactory {

    public LinearInterpolator() {
} public LinearInterpolator(Context context, AttributeSet attrs) {
} public float getInterpolation(float input) {
return input;
} /** @hide */
@Override
public long createNativeInterpolator() {
return NativeInterpolatorFactoryHelper.createLinearInterpolator();
}
}

可以看出float getInterpolator(float input)返回的值就是当前要执行的时间点实现匀速执行动画。

如何自定义一个插值器?举例:我们实现一个先减速后加速插值器,代码如下

public class DecelerateAccelerateInterpolator implements Interpolator {
@Override
public float getInterpolation(float input) {
float result;
if (input <= 0.5f) {
result = (float) (Math.sin(Math.PI * input)) / 2.0f;
} else {
result = (float) (2 - Math.sin(Math.PI * input)) / 2.0f;
}
return result;
}
}

TypeEvaluator(估值器)

TypeEvaluator用于根据当前属性改变的百分比来计算改变后的属性值,系统提供了如下几种估值器

  • IntEvaluator 针对整型属性

  • IntArrayEvaluator 针对整型属性集合

  • FloatEvaluator 针对浮点型属性

  • FloatArrayEvaluator 针对浮点型属性集合

  • ArgbEvaluator  针对Color属性

  • RectEvaluator 针对Rect属性

  • PointFEvaluator 针对PointF属性

TypeEvaluator设计也是采用策略设计模式,都实现TypeEvaluator接口,源代码如下:

package android.animation;

public interface TypeEvaluator<T> {

    public T evaluate(float fraction, T startValue, T endValue);

}

接口提供了evaluate(float fraction, T startValue, T endValue);动画在运行过程中Interpolator自动计算出动画运行的百分比fraction,然后TypeEvaluator根据fraction计算出当前动画的属性值。以FloatEvaluator 代码为例:

public class FloatEvaluator implements TypeEvaluator<Number> {

    public Float evaluate(float fraction, Number startValue, Number endValue) {
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}
}

如何自定义TypeEvaLuator?比如我们要实现一个钱的增加,字体颜色越红的动画,我们现在都知道可以使用ofArgb(),但是ofArgb()需要api 21以上才能使用,所以需要我们自定义一个ArgbEvaLuator,这里为了演示自定义TypeEvaluator直接把api 21中提供的ArgbEvaluator源代码拿来使用,如下:

public class TextArgbEvaluator implements TypeEvaluator {

    public Object evaluate(float fraction, Object startValue, Object endValue) {
int startInt = (Integer) startValue;
int startA = (startInt >> 24) & 0xff;
int startR = (startInt >> 16) & 0xff;
int startG = (startInt >> 8) & 0xff;
int startB = startInt & 0xff; int endInt = (Integer) endValue;
int endA = (endInt >> 24) & 0xff;
int endR = (endInt >> 16) & 0xff;
int endG = (endInt >> 8) & 0xff;
int endB = endInt & 0xff; return (int) ((startA + (int) (fraction * (endA - startA))) << 24) |
(int) ((startR + (int) (fraction * (endR - startR))) << 16) |
(int) ((startG + (int) (fraction * (endG - startG))) << 8) |
(int) ((startB + (int) (fraction * (endB - startB))));
}
}

调用方式:

        AnimatorSet animatorSet = new AnimatorSet();
ValueAnimator valueAnimator = ValueAnimator.ofFloat(0f, 126512.36f);
valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
float money = (float) animation.getAnimatedValue();
Log.e("Interpolator", "money---->" + money);
mTextView.setText(String.format("%.2f", money));
}
}); int startColor = Color.parseColor("#FCA3AB");
int endColor = Color.parseColor("#FB0435");
ValueAnimator colorAnimator = ValueAnimator.ofObject(new TextArgbEvaluator(),startColor, endColor);
colorAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {
@Override
public void onAnimationUpdate(ValueAnimator animation) {
int color = (int) animation.getAnimatedValue();
Log.e("Interpolator", "color---->" + color);
mTextView.setTextColor(color);
}
}); animatorSet.playTogether(valueAnimator,colorAnimator);
animatorSet.setDuration(5000);
animatorSet.setInterpolator(new LinearInterpolator());
animatorSet.start();

运行效果:

ObjectAnimator

上篇我们简单了学习了ObjectAnimator动画,并且通过ObjectAnimator实现了几种简单的动画效果,ObjectAnimator继承自ValueAnimator,所以主体方法还是ValueAnimator里实现的。先来回顾一下上篇的一个旋转动画例子。

ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(imageView, "rotation", 0f, 360f);
objectAnimator.setDuration(500);
objectAnimator.setRepeatCount(1);
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
objectAnimator.start();

这个例子很简单,针对view的属性rotation进行持续时间为500ms的0到360的角度变换。属性名字rotation在View中有对应setRotation(),否则没有任何效果,而且参数类型必须为float型,否则没有任何效果。view常见可操作的参数有:x/y;scaleX/scaleY;rotationX/ rotationY;transitionX/ transitionY等等。现在问题来了,我们本篇例子是为TextView 赋值一个float型的值,我们查看TextView的函数并不找不到setText(float f),这时该怎么处理呢?如何为不具有get/set方法的属性提供修改方法呢?莫着急!谷歌为此提供了两种方法,第一种就是使用ValueAnimator来实现,就是上面所说的方式,另外一种方式通过自己写一个包装类,来为该属性提供get/set方法。

public class MoneyTextView extends TextView {
public MoneyTextView(Context context, AttributeSet attrs) {
super(context, attrs);
} public void setText(float money) {
setText(String.format("%.2f", money));
}
}

然后就可以通过ObjectAnimator实现上面的数字动画效果了。

 ObjectAnimator objectAnimator = ObjectAnimator.ofFloat(mTextView, "text", 0f, 126512.36f);
objectAnimator.setDuration(2000);
objectAnimator.setInterpolator(new LinearInterpolator());
objectAnimator.start();

其他有关ObjectAnimator的使用方式请参考上篇文章Android动画效果之初识Property Animation(属性动画)(三)

总结:

本篇主要简单学习了属性动画的基本原理,属性动画使用了比较常见的策略设计模式,感兴趣的话可以看下这篇文章Java设计模式之策略模式(Strategy),下篇文章将借助自定义ViewGroup学习一下布局动画。

Android动画效果之Property Animation进阶(属性动画)的更多相关文章

  1. Android动画效果之初识Property Animation(属性动画)

    前言: 前面两篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画).Frame Animation(逐帧动画)Andr ...

  2. Android动画效果之Frame Animation(逐帧动画)

    前言: 上一篇介绍了Android的Tween Animation(补间动画) Android动画效果之Tween Animation(补间动画),今天来总结下Android的另外一种动画Frame ...

  3. Android动画效果之Tween Animation(补间动画)

    前言: 最近公司项目下个版本迭代里面设计了很多动画效果,在以往的项目中开发中也会经常用到动画,所以在公司下个版本迭代开始之前,抽空总结一下Android动画.今天主要总结Tween Animation ...

  4. Android动画效果之自定义ViewGroup添加布局动画

    前言: 前面几篇文章介绍了补间动画.逐帧动画.属性动画,大部分都是针对View来实现的动画,那么该如何为了一个ViewGroup添加动画呢?今天结合自定义ViewGroup来学习一下布局动画.本文将通 ...

  5. Android物业动画研究(Property Animation)彻底解决具体解释

     前p=1959">Android物业动画研究(Property Animation)全然解析具体解释上已经基本展示了属性动画的核心使用方法: ObjectAnimator实现动画 ...

  6. 【属性动画总结】Property Animation

    属性动画概述 3.0以前,android仅支持两种动画模式,tweened animation 和 frame-by-frame animation,在android3.0中又引入了一个新的动画系统: ...

  7. Android属性动画完全解析(上),初识属性动画的基本用法

    转载请注明出处:http://blog.csdn.net/guolin_blog/article/details/43536355 在手机上去实现一些动画效果算是件比较炫酷的事情,因此Android系 ...

  8. 属性动画总结(Property Animation)

    一.概述 属性动画可以作用在View的属性上,对属性进行修改,而且不要求对应的属性一定是有显示效果的. 二.属性动画的实现方式 1.基础的类Animator Animator是一个抽象类,是属性动画的 ...

  9. 【属性动画示例】Property Animation

    MainActivity 属性动画常用操作 // 可操控的属性有:alpha:x/y:scaleX/scaleY:rotation/rotationX/rotationY:transitionX/tr ...

随机推荐

  1. 启动了VSAN服务的主机不在vCenter集群中

    背景: 这个问题的来源是,某用户将该ESXi主机直接夺取到另一个vCenterA的管辖中,而这个vCenterA中集群A开启了VSAN功能,导致再次反向夺取到vCenterB中的时候带有了来自于集群A ...

  2. vue2.0实践的一些细节

    最近用vue2.0做了个活动.做完了回头发现,好像并没有太多的技术难点,而自己好像又做了比较久...只能说效率有待提升啊...简单总结了一些比较细节的点. 1.对于一些已知肯定会有数据的模块,先用一个 ...

  3. ASP.NET Core 中文文档 第四章 MVC(3.8)视图中的依赖注入

    原文:Dependency injection into views 作者:Steve Smith 翻译:姚阿勇(Dr.Yao) 校对:孟帅洋(书缘) ASP.NET Core 支持在视图中使用 依赖 ...

  4. 微软发布正式版SQL Server 2016

    微软于今天在SQL 官方博客上宣布 SQL Server 数据库软件的正式发布版本(GA),历时一年多,微软为该软件发布了多个公共预览版和候选版本,而今天最终版本终于上线了.在博客中,微软数据集团的企 ...

  5. 关于这段时间学习 EntityFramework的 一点感悟

    Ado.Net,用了N多年,Entity Framework也关注了很多年. 每当项目转型的时候,就花费大巴的时间,学习一番,潮流的东西. 这个Orm很多,这个EF很火,这么多年了,我还是不敢用,虽然 ...

  6. ADO.NET对象的详解

    1. Connection 类 和数据库交互,必须连接它.连接帮助指明数据库服务器.数据库名字.用户名.密码,和连接数据库所需要的其它参数.Connection对象会被Command对象使用,这样就能 ...

  7. .Net Core MVC 网站开发(Ninesky) 2.2、栏目管理功能-System区域添加

    在asp或asp.net中为了方便网站的结构清晰,通常把具有类似功能的页面放到一个文件夹中,用户管理功能都放在Admin文件夹下,用户功能都放在Member文件夹下,在MVC中,通常使用区域(Area ...

  8. NET Core-TagHelper实现分页标签

    这里将要和大家分享的是学习总结使用TagHelper实现分页标签,之前分享过一篇使用HtmlHelper扩展了一个分页写法地址可以点击这里http://www.cnblogs.com/wangrudo ...

  9. OpenCV人脸识别Eigen算法源码分析

    1 理论基础 学习Eigen人脸识别算法需要了解一下它用到的几个理论基础,现总结如下: 1.1 协方差矩阵 首先需要了解一下公式: 共公式可以看出:均值描述的是样本集合的平均值,而标准差描述的则是样本 ...

  10. fir.im Weekly - 关于 iOS10 适配、开发、推送的一切

    "小程序"来了,微信变成名副其实的 Web OS,新一轮的Web App 与Native App争论四起.程序员对新技术永远保持灵敏的嗅觉和旺盛的好奇心,@李锦发整理了微信小程序资 ...