Android 属性动画Property Animation(上)介绍了属性动画的概念以及相关的类和接口,本篇来看下具体肿么使用。

  • ValueAnimator ValueAnimator指定整形、浮点型或者颜色值作为动画值,在一定时间内平滑过渡。可以通过ofInt(),ofFloat(),或ofObject()来或得一个ValueAnimator,如:
ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);
animation.setDuration(1000);
animation.start();
复制代码

当调用start()方法后,将一个浮点型值从0.0平滑过渡到1.0,时长1000毫秒。当然也可以自定义类型,如:

ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);
animation.setDuration(1000);
animation.start();
复制代码

上述代码没有实际效果,因为ValueAnimator并不直接作用于对象或属性,通常会通过这些计算的值来不断改变动画的对象,可以通过设置监听器并调用getAnimatedValue()来不断获得帧刷新的计算值。如:

 ValueAnimator animator = ValueAnimator.ofFloat(0f, 1f);animator.setDuration(200);animator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator animation) {float value = (float) animation.getAnimatedValue();Log.e("TTT", "value is " + value);}});animator.start();
复制代码

Log输出:

E/TTT: value is 0.0
E/TTT: value is 0.0
E/TTT: value is 0.15204361
E/TTT: value is 0.36806342
E/TTT: value is 0.5
E/TTT: value is 0.63193655
E/TTT: value is 0.7545208
E/TTT: value is 0.85906315
E/TTT: value is 0.93815327
E/TTT: value is 0.98618495
E/TTT: value is 1.0
复制代码

上面代码是从0.0过渡到1.0,ofFloat()方法中可以传入任意多个参数,如:ValueAnimator.ofFloat(0.0f, 0.5f, 0.75f, 1.0f)可以从0.0f过渡到0.5f,再过渡到0.75f,再过渡到1.0f。 ValueAnimator通常还有下面的方法:

  //设置重复次数animator.setRepeatCount(1);//REVERSE 倒序播放  RESTART 重新播放animator.setRepeatMode(ValueAnimator.REVERSE);//延迟播放animator.setStartDelay(1000);
//设置时间插值器为先加速后减速animator.setInterpolator(new DecelerateInterpolator());
复制代码

ValueAnimator 还可以用XML文件来写,这样写的好处是更容易被复用,为了和API 11之前的动画做区分,请将属性动画的XML文件放在**res/animator/**目录下,如新建一个value_animator.xml文件,示例:

<?xml version="1.0" encoding="utf-8"?>
<animator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:repeatCount="1"android:repeatMode="reverse"android:valueFrom="0.0"android:valueTo="1.0"android:valueType="floatType" />
复制代码

在代码中加载XML文件:

  //加载XML文件ValueAnimator animator = (ValueAnimator) AnimatorInflater.loadAnimator(this, R.animator.value_animator);//设置要执行动画的目标animator.setTarget(myObject);//动画执行animator.start();
复制代码

还可以使用 PropertyValuesHolder和 Keyframe标签创建一个多步的动画,如:

<animator xmlns:android="http://schemas.android.com/apk/res/android"android:duration="1000"android:repeatCount="1"android:repeatMode="reverse"><propertyValuesHolder><keyframe android:fraction="0f" android:value="0f"/><keyframe android:fraction="0.5f" android:value="5f"/><keyframe android:fraction="1f" android:value="0f"/></propertyValuesHolder>
</animator>
复制代码

解释一下PropertyValuesHolder和Keyframe: PropertyValuesHolder:顾名思义,就是属性值持有者,它保存了动画过程中所需要操作的属性和对应的值,我们通过ofFloat(Object target, String propertyName, float… values)构造的动画,ofFloat()的内部实现其实就是将传进来的参数封装成PropertyValuesHolder实例来保存动画状态。在封装成PropertyValuesHolder实例以后,后面的操作也是以PropertyValuesHolder为主的。 **Keyframe:意为关键帧,设置了关键帧后,动画就可以在各个关键帧之间平滑过渡的,一个关键帧必须包含两个原素,第一时间点,第二位置,即这个关键帧是表示的是某个物体在哪个时间点应该在哪个位置上。fraction表示当前进度,value表示当前位置。 **如上面所示: 表示动画进度为0时,动画所在的数值位置为0; 表示动画进度为50%时,动画所在的数值位置为5; 表示动画完成时,动画所在的数值位置为0。

上述XML代码也可以用代码表示:

//创建关键帧
Keyframe keyframe1 = Keyframe.ofFloat(0f, 0f);
Keyframe keyframe2 = Keyframe.ofFloat(0.5f, 5f);
Keyframe keyframe3 = Keyframe.ofFloat(1.0f, 0f);
//创建PropertyValuesHolder
PropertyValuesHolder propertyValuesHolder = PropertyValuesHolder.ofKeyframe(propertyName, keyframe1, keyframe2, keyframe3);
//创建ObjectAnimator
ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(target, propertyValuesHolder);
//设置动画时长
objectAnimator.setDuration(1000);
//设置动画重复次数
objectAnimator.setRepeatCount(1);
//设置动画重复模式
objectAnimator.setRepeatMode(ValueAnimator.REVERSE);
//启动动画
objectAnimator.start();
复制代码

如果想无限循环动画,调用setRepeatCount(ValueAnimator.INFINITE)即可。

  • AnimatorSet 如果想使用组合动画,可以使用AnimatorSet将多个动画组合到一起:
AnimatorSet bouncer = new AnimatorSet();
bouncer.play(bounceAnim).before(squashAnim1);
bouncer.play(squashAnim1).with(squashAnim2);
bouncer.play(squashAnim1).with(stretchAnim1);
bouncer.play(squashAnim1).with(stretchAnim2);
bouncer.play(bounceBackAnim).after(stretchAnim2);
ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);
fadeAnim.setDuration(250);
AnimatorSet animatorSet = new AnimatorSet();
animatorSet.play(bouncer).before(fadeAnim);
animatorSet.start();
复制代码

执行顺序: 1.执行bounceAnim动画 2.同时执行squashAnim1, squashAnim2, stretchAnim1, stretchAnim2动画 3.执行bounceBackAnim动画 4.最后fadeAnim.

下一篇:Android 属性动画Property Animation(下)

转载于:https://juejin.im/post/5a33e7d0f265da4322414318

Android 属性动画Property Animation(中)相关推荐

  1. Android 属性动画(Property Animation) ObjectAnimator的介绍

    先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...

  2. Android 属性动画(Property Animation) ValueAnimator 的介绍

    先说下属性动画与视图动画的区别: 视图动画系统仅提供为 View 对象添加动画效果的功能,因此,如果您想为非 对象添加动画效果,则必须实现自己的代码才能做到.视图动画系统也存在一些限制,因为它仅公开 ...

  3. 【Android 属性动画】属性动画 Property Animation 与 视图动画 View Animation 区别

    文章目录 一.动画效果添加对象 二.动画效果类型 三.动画效果与实际属性 四.开发复杂程度 属性动画 Property Animation 可以为 任何对象 ( View 对象 / 非 View 对象 ...

  4. 属性动画-Property Animation之ViewPropertyAnimator 你应该知道的一切

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52381558 出自[zejian的博客] 关联文章: 走进绚烂多彩的 ...

  5. 走进绚烂多彩的属性动画-Property Animation(上篇)

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52273733 出自[zejian的博客] 关联文章: 走进绚烂多彩的 ...

  6. 走进绚烂多彩的属性动画-Property Animation之TimeInterpolator和TypeEvaluator(下篇)

    转载请注明出处(万分感谢!): http://blog.csdn.net/javazejian/article/details/52334098 出自[zejian的博客] 关联文章: 走进绚烂多彩的 ...

  7. (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法

    版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...

  8. android 属性动画实例,Android属性动画完全解析 中 ,ValueAnimator和ObjectAnimator的高级用法...

    大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了 ...

  9. 【Android 属性动画】属性动画 Property Animation 工作原理 ( 线性插值动画 | 非线性插值动画 | 动画计算 | 经过分数 | 插值分数 | 类型估值器)

    文章目录 一.线性插值动画示例 二.非线性插值动画示例 三.动画计算方式 四.时间经过分数 ( Elapsed Fraction ) 五.插值分数 ( Interpolated Fraction ) ...

最新文章

  1. 多目标跟踪 | FairMOT:统一检测、重识别的多目标跟踪框架,全新Baseline
  2. C++命名空间 namespace的作用和使用解析
  3. spring源码学习一
  4. elastic-job详解(一):数据分片
  5. Java Review - 并发编程_ 回环屏障CyclicBarrier原理源码剖析
  6. PHP实现数组中两个数的和等于给定的目标值
  7. 【dp 贪心】bzoj4391: [Usaco2015 dec]High Card Low Card
  8. 关于《详解》第12.1节按键驱动的进一步阐述
  9. 灰色关联度分析_数学建模|关联分析之术|灰度预测模型预备知识
  10. HTML5给我们带来了什么
  11. 多线程的那点儿事(之避免死锁)
  12. 回到顶部效果之加速置顶
  13. upgrade cmake-gui version
  14. RESTful源码笔记之RESTful Framework的基本组件
  15. 汇编语言寄存器相关知识(AX/BX/CX/DX+mov/add+物理地址+段+CS/IP+jmp)
  16. Java习题>|异常>|throw自定义异常小案例
  17. codeforces每日5题(均1500)-第二十二天
  18. 【CSS基础】文字垂直居中
  19. JAVA大华摄像头抓拍与API接口集成
  20. 彻底解决“Your CPU supports instructions that this TensorFlow binary was not compiled to use: AVX2 FMA”警告

热门文章

  1. 中望cad能编写lisp吗_宁水集团:中望CAD解决方案增强设计创新力,加速转型促发展...
  2. requests库学习
  3. 万字精华——Python常见的60+面试题合集双手奉上!
  4. html做偶像图片2048小游戏,一个自制的2048小游戏(一)
  5. Miktex + WinEdit 实现LaTeX写论文
  6. 埃尔米特(Hermite)插值及其MATLAB程序
  7. android 广播观察者,作业三——观察者模式在Android广播机制上的应用
  8. 从零开始刷Leetcode——数组(941.977)
  9. 单证票据识别之关键信息提取
  10. flask ajax 文件上传,使用ajax上传Python flask文件请求.files空的