转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616
本文出自【赵彦军的博客】

文章目录

  • ObjectAnimator
  • 实战-心跳动画
  • 参考资料

ObjectAnimator

public final class ObjectAnimator extends ValueAnimator {...
}

ObjectAnimator 继承 ValueAnimator , 所以 ObjectAnimator 拥有 ValueAnimator 一切特性。

相比于ValueAnimatorObjectAnimator可能才是我们最常接触到的类,因为ValueAnimator只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说Viewalpha属性。

不过虽说ObjectAnimator会更加常用一些,但是它其实是继承自ValueAnimator的,底层的动画实现机制也是基于ValueAnimator来完成的,因此ValueAnimator仍然是整个属性动画当中最核心的一个类。那么既然是继承关系,说明ValueAnimator中可以使用的方法在ObjectAnimator中也是可以正常使用的,它们的用法也非常类似,这里如果我们想要将一个TextView在5秒中内从常规变换成全透明,再从全透明变换成常规,就可以这样写:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f, 1f);
animator.setDuration(5000);
animator.start();

可以看到,我们还是调用了ofFloat()方法来去创建一个ObjectAnimator的实例,只不过ofFloat()方法当中接收的参数有点变化了。这里第一个参数要求传入一个object对象,我们想要对哪个对象进行动画操作就传入什么,这里我传入了一个textview。第二个参数是想要对该对象的哪个属性进行动画操作,由于我们想要改变TextView的不透明度,因此这里传入"alpha"。后面的参数就是不固定长度了,想要完成什么样的动画就传入什么值,这里传入的值就表示将TextView从常规变换成全透明,再从全透明变换成常规。之后调用setDuration()方法来设置动画的时长,然后调用start()方法启动动画,效果如下图所示:

学会了这一个用法之后,其它的用法我们就可以举一反三了,那比如说我们想要将TextView进行一次360度的旋转,就可以这样写:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "rotation", 0f, 360f);
animator.setDuration(5000);
animator.start();

可以看到,这里我们将第二个参数改成了"rotation",然后将动画的初始值和结束值分别设置成0和360,现在运行一下代码,效果如下图所示:

那么如果想要将TextView先向左移出屏幕,然后再移动回来,就可以这样写:

float curTranslationX = textview.getTranslationX();
ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "translationX", curTranslationX, -500f, curTranslationX);
animator.setDuration(5000);
animator.start();

这里我们先是调用了TextViewgetTranslationX()方法来获取到当前TextView的translationX的位置,然后ofFloat()方法的第二个参数传入"translationX",紧接着后面三个参数用于告诉系统TextView应该怎么移动,现在运行一下代码,效果如下图所示:


然后我们还可以TextView进行缩放操作,比如说将TextView在垂直方向上放大3倍再还原,就可以这样写:

ObjectAnimator animator = ObjectAnimator.ofFloat(textview, "scaleY", 1f, 3f, 1f);
animator.setDuration(5000);
animator.start();

这里将ofFloat()方法的第二个参数改成了"scaleY",表示在垂直方向上进行缩放,现在重新运行一下程序,效果如下图所示:


到目前为止,ObjectAnimator的用法还算是相当简单吧,但是我相信肯定会有不少朋友现在心里都有同样一个疑问,就是ofFloat()方法的第二个参数到底可以传哪些值呢?

目前我们使用过了alpharotationtranslationXscaleY这几个值,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画,那么还有哪些值是可以使用的呢?

其实这个问题的答案非常玄乎,就是我们可以传入任意的值到ofFloat()方法的第二个参数当中。任意的值?相信这很出乎大家的意料吧,但事实就是如此。因为ObjectAnimator在设计的时候就没有针对于View来进行设计,而是针对于任意对象的,它所负责的工作就是不断地向某个对象中的某个属性进行赋值,然后对象根据属性值的改变再来决定如何展现出来。

那么比如说我们调用下面这样一段代码:

ObjectAnimator.ofFloat(textview, "alpha", 1f, 0f);

其实这段代码的意思就是ObjectAnimator会帮我们不断地改变textview对象中alpha属性的值,从1f变化到0f。然后textview对象需要根据alpha属性值的改变来不断刷新界面的显示,从而让用户可以看出淡入淡出的动画效果。

那么textview对象中是不是有alpha属性这个值呢?

没有,不仅textview没有这个属性,连它所有的父类也是没有这个属性的!

这就奇怪了,textview当中并没有alpha这个属性,ObjectAnimator是如何进行操作的呢?其实ObjectAnimator内部的工作机制并不是直接对我们传入的属性名进行操作的,而是会去寻找这个属性名对应的get和set方法,因此alpha属性所对应的get和set方法应该就是:

public void setAlpha(float value);
public float getAlpha();

那么textview对象中是否有这两个方法呢?确实有,并且这两个方法是由View对象提供的,也就是说不仅TextView可以使用这个属性来进行淡入淡出动画操作,任何继承自View的对象都可以的。

既然alpha是这个样子,相信大家一定已经明白了,前面我们所用的所有属性都是这个工作原理,那么View当中一定也存在着setRotation()getRotation()setTranslationX()getTranslationX()setScaleY()getScaleY()这些方法,不信的话你可以到View当中去找一下。

实战-心跳动画

先上效果图:


自定义 View

/*** @author : zhaoyanjun* @time : 2021/7/13* @desc :*/
class MyView(context: Context?, attrs: AttributeSet?) : View(context, attrs) {private var radius = 10f  //圆的半径set(value) {field = valueinvalidate()}private val paint = Paint()init {paint.color = Color.BLUEpaint.textSize = 8fpaint.isAntiAlias = truepaint.style = Paint.Style.FILL}override fun onDraw(canvas: Canvas?) {super.onDraw(canvas)//绘制圆canvas?.drawCircle((width / 2).toFloat(), (height / 2).toFloat(), radius, paint)}
}

有一点很重要的是,radius 的 set 方法中需要调用 invalidate() 方法,才能够刷新view

我们再看执行动画的部分

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)setContentView(R.layout.activity_main)var myView: MyView = findViewById(R.id.myView)//通过动画,不断的改变 radius 的值var objectAnimator =ObjectAnimator.ofFloat(myView, "radius", 200f, 500f, 200f)objectAnimator.duration = 600objectAnimator.interpolator = LinearInterpolator()objectAnimator.repeatCount = 20  //执行20次objectAnimator.start()}
}

参考资料

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

Android属性动画 ObjectAnimator相关推荐

  1. Android 属性动画ObjectAnimator使用demo,组合动画

    //第一个参数:指定执行动画的控件,第二个参数:指定控件的属性,第三个参数是可变长参数 public static ObjectAnimator ofFloat(Object target, Stri ...

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

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

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

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

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

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

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

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

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

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

  7. Android 属性动画使用(二)

    首先扯点别的:晚上稍微跑了一会步,然后逛了超市,晚饭喝的南瓜粥,吃了一碗面条,今天不是太饿,现在正一边吃着葡萄一边学习,也是没谁了. 比如说,我们想要实现从0过渡到100,使用ValueAnimato ...

  8. android+属性动画+高度,android 自定义view+属性动画实现充电进度条

    近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和 ...

  9. 秒懂Android属性动画

    自从Android3.0 版本加入属性动画后,在平时的开发中多多少少也使用了,但是从来没有对其做一个系统的分析和总结,最近刚好有点时间,来对这个话题做一个分析和总结. 概述 Android动画体系 引 ...

最新文章

  1. LVS集群类型之TUN 隧道
  2. 2 - 4 - 实例:X86的中断与异常机制(9-48)
  3. MySQL创建用户(CREATE USER)
  4. PL/SQL Step By Step(三)
  5. Android连接网络立即同步时区
  6. MongoDB 自动分片 auto sharding
  7. Introduction to Computer Networking学习笔记(十六):Queue Model 包交换中的缓冲模型
  8. php实时聊天源码 仿手机QQ,php加swoole加mysql 仿webqq及时聊天
  9. 抖音小程序服务器域名,抖音小程序使用场景、3大入口详细介绍
  10. Python import无法导入包问题
  11. Python三维绘图--Matplotlib
  12. 补码1位乘法和补码2位乘法(Booth算法)(三栏式)详解学习
  13. spring定时任务@schedule
  14. vmware安装openEuler+基本环境部署
  15. 【C#】基础篇(2) C#实现串口助手,C#扫描串口
  16. 学习公式——《微习惯》
  17. 网页字体单位px、em、%、rem、pt、vm、vh介绍
  18. 线性时不变系统——信号系统学习笔记
  19. PMSM电机学习记录--矢量控制之滞环电流控制(Bang-Bang控制)
  20. 量子计算机生命,100年后,量子计算机将创造生命,生命的起源或将被改写

热门文章

  1. 计算机教学中因才施教,浅析高校《大学计算机基础》教学中的因材施教
  2. 程序显示文本框_C++入门到精通(二),编写我们自己的Hello World程序
  3. AI安检:北航提出安检场景下的危险品检测基准和去遮挡注意力模块
  4. ICML 2021 | AlphaNet:基于α-散度的超网络训练方法
  5. 博士申请 | 上海交通大学叶南阳助理教授招收机器学习方向博士生
  6. 博士申请 | ​英属哥伦比亚大学李霄霄助理教授招收全奖博士生、硕士生
  7. 第四届AutoDL挑战赛——AutoSpeech2019正式开赛
  8. GCD LCM 欧几里得算法 扩展欧几里得算法
  9. 表白记 BFS求最短路径
  10. c语言自增自减5运算符详解,巧用C语言中的自增自减运算符