Android动画系列:

  • 补间动画详解
  • 帧动画
  • LayoutAnimation
  • LayoutTransition
  • 属性动画 - 基本使用
  • 属性动画 - Interpolator(内插器)
  • 属性动画 - TypeEvaluator
  • 属性动画 - Keyframe
  • AnimatorSet

PropertyValuesHolder

PropertyValuesHolder是一个存储器,用来存储动画属性的信息和值,用于使用ValueAnimator或ObjectAnimator创建动画,它们对多个不同的属性并行操作。

valueAnimator

通过PropertyValuesHolder存储“translationX”和“translationY”属性的值。在AnimatorUpdateListener监听的onAnimationUpdate()中,ValueAnimator通过getAnimatedValue(String)方法获取相应动画属性的值,其参数为动画属性的信息,然后在调用相应的setXX(),设置view的属性,其自动调用invalidate()刷新屏幕。

    PropertyValuesHolder holderRight = PropertyValuesHolder.ofFloat(PropertyConstant.PROPERTY_TRANSLATION_X,100f);PropertyValuesHolder holderTop = PropertyValuesHolder.ofFloat(PropertyConstant.PROPERTY_TRANSLATION_Y, 300f);ValueAnimator valueAnimator = ValueAnimator.ofPropertyValuesHolder(holderRight, holderTop);valueAnimator.setRepeatCount(ValueAnimator.INFINITE);valueAnimator.setDuration(3000);valueAnimator.setTarget(btnProperty);valueAnimator.addUpdateListener(new ValueAnimator.AnimatorUpdateListener() {@Overridepublic void onAnimationUpdate(ValueAnimator valueAnimator) {float left = (float) valueAnimator.getAnimatedValue(PropertyConstant.PROPERTY_TRANSLATION_X);float top = (float) valueAnimator.getAnimatedValue(PropertyConstant.PROPERTY_TRANSLATION_Y);btnProperty.setTranslationX(left);btnProperty.setTranslationY(top);}});valueAnimator.start();

ObjectAnimator

鉴于ObjectAniator的局限性,PropertyValuesHolder内保存的属性,ObjectAniator

    PropertyValuesHolder holderRight = PropertyValuesHolder.ofFloat(PropertyConstant.PROPERTY_TRANSLATION_X, 100f);PropertyValuesHolder holderTop = PropertyValuesHolder.ofFloat(PropertyConstant.PROPERTY_TRANSLATION_Y, 300f);ObjectAnimator objectAnimator = ObjectAnimator.ofPropertyValuesHolder(btnProperty, holderRight, holderTop).setDuration(3000);objectAnimator.setRepeatCount(ValueAnimator.INFINITE);objectAnimator.setRepeatMode(ValueAnimator.REVERSE);objectAnimator.start();

Keyframe

介绍

KeyFrame成为关键帧,是用来存储时间、值的键值对,实际上存储的是动画的执行进度和动画的属性值,用来定义动画的特定时间的帧。另外,每个关键帧可以拥有自己的插值器,用来控制动画在上一个关键帧和该关键帧的时间之间的间隔中的行为。

KeyFrame本事是一个抽象类。大家都知道的是抽象类本身并不能够实例化,如果想创建KeyFrame的实例,必须使用ofInt(),ofFloat()或ofObject()的工厂方法之一来获得相应类型的关键帧,而在工厂方法中创建的实例实际上是KeyFrame的子类。以ofInt为例:

public abstract class Keyframe implements Cloneable {***public static Keyframe ofInt(float fraction, int value) {return new IntKeyframe(fraction, value);}***static class IntKeyframe extends Keyframe {***IntKeyframe(float fraction, int value) {mFraction = fraction;mValue = value;mValueType = int.class;mHasValue = true;}IntKeyframe(float fraction) {mFraction = fraction;mValueType = int.class;}***}
}

使用Keyframe.ofInt()工厂方法创建KeyFrame实例,实际上是在其方法内创建了IntKeyFrame的实例,而IntKeyFrame是不仅仅是KeyFrame的内部类,同时又是KeyFrame的子类,其内实现了KeyFrame的公共方法,作为工厂模式的产品类。因而调用ofInt()工厂方法可以创建KeyFrame实例。

常用API

  • ofFloat(float fraction):创建KeyFrame实例
  • ofFloat(float fraction, float value):创建KeyFrame实例
  • ofInt(float fraction, int value):创建KeyFrame实例
  • ofInt(float fraction):创建KeyFrame实例
  • ofObject(float fraction, Object value):创建KeyFrame实例
  • ofObject(float fraction):创建KeyFrame实例
  • setInterpolator(TimeInterpolator interpolator):设置KeyFrame的插值器

注:

  1. 参数fraction为动画的执行进度百分比
  2. 参数value为该关键帧的动画属性值

使用步骤

  1. 采用ofInt(),ofFloat()或ofObject()的工厂方法等工厂方法创建KeyFrame实例
  2. 调用ofKeyframe()工厂方法来创建PropertyValuesHolder实例
  3. 通过PropertyValuesHolder实例创建ValueAnimatior实例

动画实例

有这么一个动画效果让Button旋转,在2.5s内从初始位置旋转360度,然后再反向旋转2.5s后回到初始位置。如果用Keyframe该如何处理呢?从动画效果上来看,有3个时间点0s、2.5s、5s,也就是动画应该有三个关键帧,其动画百分比分别说0f、0.5f、1f,动画属性分别说0f、360f、0f。既然分析出了关键帧,这件事事情就好办了。

示例代码及效果图如下:

// 1. 创建Keyframe实例
// 参数1为该关键帧处于动画的执行百分比
// 参数2为该关键字的动画属性值
Keyframe keyframe_0 = Keyframe.ofFloat(0f, 0f);
Keyframe keyframe_1 = Keyframe.ofFloat(0.5f, 360f);
Keyframe keyframe_2 = Keyframe.ofFloat(1f, 0f);// 设置Keyframe的插值器
keyframe_1.setInterpolator(new LinearInterpolator());
keyframe_2.setInterpolator(new AccelerateDecelerateInterpolator());//  2. 创建PropertyValuesHolder对象
PropertyValuesHolder holder = PropertyValuesHolder.ofKeyframe(PropertyConstant.PROPERTY_ROTATION, keyframe_0, keyframe_1, keyframe_2);// 3. 创建ValueAnimator实例
ObjectAnimator animator = ObjectAnimator.ofPropertyValuesHolder(btnProperty, holder);
animator.setDuration(5000);
animator.setRepeatCount(ValueAnimator.INFINITE);
animator.start();

Android 属性动画 - Keyframe相关推荐

  1. Android属性动画 Keyframe

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118963313 本文出自[赵彦军的博客] 文章目录 KeyFrame 实战 Key ...

  2. Android 系统(196)---Android 属性动画

    Android 属性动画 属性动画 总结&攻略 前言 动画的使用 是 Android 开发中常用的知识 本文将详细介绍 Android 动画中 属性动画的原理 & 使用 动画类型 关于 ...

  3. Android 属性动画Property Animation(中)

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

  4. Android 属性动画(一)新手入门

    一.属性动画简介 Android 中动画有很多种,属性动画就是其中的一种.所谓的属性动画,就是在指定的时间内,通过改变对象的属性达到变化效果的动画.在 Android 中,属性动画系统是一个强健的框架 ...

  5. Android 属性动画 详解

    Android 属性动画 详解 Android动画类型: View Animation(即所谓的Tween Animation补间动画):View Animation相当简单,不过只能支持简单的缩放. ...

  6. 三谈属性动画——Keyframe以及ViewPropertyAnimator

    Android动画和Transition系列文章 初识属性动画--使用Animator创建动画 再谈属性动画--介绍以及自定义Interpolator插值器 三谈属性动画--Keyframe以及Vie ...

  7. android动画封装,Android属性动画封装,快速构建动画

    Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...

  8. Android属性动画 ObjectAnimator

    转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616 本文出自[赵彦军的博客] 文章目录 ObjectAnimator ...

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

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

最新文章

  1. H5 canvas 绘图
  2. 通过ddmlib杀死某个android进程的方法
  3. 我用 tensorflow 实现的“一个神经聊天模型”:一个基于深度学习的聊天机器人
  4. 图像处理——Edge Boxes边缘检测
  5. 单片机中断程序实例_单片机定时器中断实现长时间定时程序
  6. java什么是同步_什么是同步?什么是互斥?
  7. Men and women can't be 'just friends
  8. 2020年容器应用的新思考
  9. ceisum加载shp格式的城市白模建筑数据
  10. im即时通讯源码/uniapp即时通讯im源码附视频安装教程
  11. mysql例题_mysql 练习题
  12. 分享一下老型号macbook pro在win10下安装BootCamp6.0驱动的方法
  13. 算法学习笔记(5) 传递闭包
  14. 批处理为win7桌面添加计算机图标,WIN7桌面显示IE图标bat
  15. 深度学习Course4第三周Detection Algorithms习题整理
  16. 非视距(非视域)成像(Non-Line-of-Sight,NLOS Imaging) Github开源代码合集
  17. B. A and B
  18. 什么是HTTP状态码?常见HTTP状态码盘点
  19. 计算机组成原理实验:全加器实验
  20. 6、python-mongodb获取数据存储到sql server

热门文章

  1. SQL报错: > ORA-00918: column ambiguously defined
  2. vs studio 2010旗舰版下载
  3. (专升本)Word表格(调整行高与列宽、插入、删除行或列和单元格)
  4. 如何提取CAD里面的文字
  5. python拟合非线性模型_初学Python拟合Langmuir非线性方程
  6. ICCV2021 | 单目3D目标检测框架GUPNet解析
  7. 导电滑环的型号有哪些,工作寿命多长?
  8. ubuntu 输入法
  9. 2.使用insightface读取视频进行人脸识别
  10. Linux查看机器配置信息