Android属性动画 ObjectAnimator
转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/118709616
本文出自【赵彦军的博客】
文章目录
- ObjectAnimator
- 实战-心跳动画
- 参考资料
ObjectAnimator
public final class ObjectAnimator extends ValueAnimator {...
}
ObjectAnimator
继承 ValueAnimator
, 所以 ObjectAnimator
拥有 ValueAnimator
一切特性。
相比于ValueAnimator
,ObjectAnimator
可能才是我们最常接触到的类,因为ValueAnimator
只不过是对值进行了一个平滑的动画过渡,但我们实际使用到这种功能的场景好像并不多。而ObjectAnimator
则就不同了,它是可以直接对任意对象的任意属性进行动画操作的,比如说View
的alpha
属性。
不过虽说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();
这里我们先是调用了TextView
的getTranslationX()
方法来获取到当前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()
方法的第二个参数到底可以传哪些值呢?
目前我们使用过了alpha
、rotation
、translationX
和scaleY
这几个值,分别可以完成淡入淡出、旋转、水平移动、垂直缩放这几种动画,那么还有哪些值是可以使用的呢?
其实这个问题的答案非常玄乎,就是我们可以传入任意的值到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相关推荐
- Android 属性动画ObjectAnimator使用demo,组合动画
//第一个参数:指定执行动画的控件,第二个参数:指定控件的属性,第三个参数是可变长参数 public static ObjectAnimator ofFloat(Object target, Stri ...
- (转)Android属性动画完全解析(中),ValueAnimator和ObjectAnimator的高级用法
版权声明:本文出自郭霖的博客,转载必须注明出处. 目录(?)[-] ValueAnimator的高级用法 ObjectAnimator的高级用法 转载请注明出处:http://blog.csdn.ne ...
- android 属性动画实例,Android属性动画完全解析 中 ,ValueAnimator和ObjectAnimator的高级用法...
大家好,在上一篇文章当中,我们学习了Android属性动画的基本用法,当然也是最常用的一些用法,这些用法足以覆盖我们平时大多情况下的动画需求了.但是,正如上篇文章当中所说到的,属性动画对补间动画进行了 ...
- android动画封装,Android属性动画封装,快速构建动画
Android实现动画效果的方式主要有帧动画.补间动画.属性动画.关于安桌动画的基础知识可以查看这篇文章Android属性动画完全解析 这里我要讲的是如何快速构建出一个动画效果,如下图: 如果我们用属 ...
- Android 系统(196)---Android 属性动画
Android 属性动画 属性动画 总结&攻略 前言 动画的使用 是 Android 开发中常用的知识 本文将详细介绍 Android 动画中 属性动画的原理 & 使用 动画类型 关于 ...
- Android 属性动画Property Animation(中)
Android 属性动画Property Animation(上)介绍了属性动画的概念以及相关的类和接口,本篇来看下具体肿么使用. ValueAnimator ValueAnimator指定整形.浮点 ...
- Android 属性动画使用(二)
首先扯点别的:晚上稍微跑了一会步,然后逛了超市,晚饭喝的南瓜粥,吃了一碗面条,今天不是太饿,现在正一边吃着葡萄一边学习,也是没谁了. 比如说,我们想要实现从0过渡到100,使用ValueAnimato ...
- android+属性动画+高度,android 自定义view+属性动画实现充电进度条
近期项目中需要使用到一种类似手机电池充电进度的动画效果,以前没学属性动画的时候,是用图片+定时器的方式来完成的,最近一直在学习动画这一块,再加上复习一下自定义view的相关知识点,所以打算用属性动画和 ...
- 秒懂Android属性动画
自从Android3.0 版本加入属性动画后,在平时的开发中多多少少也使用了,但是从来没有对其做一个系统的分析和总结,最近刚好有点时间,来对这个话题做一个分析和总结. 概述 Android动画体系 引 ...
最新文章
- LVS集群类型之TUN 隧道
- 2 - 4 - 实例:X86的中断与异常机制(9-48)
- MySQL创建用户(CREATE USER)
- PL/SQL Step By Step(三)
- Android连接网络立即同步时区
- MongoDB 自动分片 auto sharding
- Introduction to Computer Networking学习笔记(十六):Queue Model 包交换中的缓冲模型
- php实时聊天源码 仿手机QQ,php加swoole加mysql 仿webqq及时聊天
- 抖音小程序服务器域名,抖音小程序使用场景、3大入口详细介绍
- Python import无法导入包问题
- Python三维绘图--Matplotlib
- 补码1位乘法和补码2位乘法(Booth算法)(三栏式)详解学习
- spring定时任务@schedule
- vmware安装openEuler+基本环境部署
- 【C#】基础篇(2) C#实现串口助手,C#扫描串口
- 学习公式——《微习惯》
- 网页字体单位px、em、%、rem、pt、vm、vh介绍
- 线性时不变系统——信号系统学习笔记
- PMSM电机学习记录--矢量控制之滞环电流控制(Bang-Bang控制)
- 量子计算机生命,100年后,量子计算机将创造生命,生命的起源或将被改写
热门文章
- 计算机教学中因才施教,浅析高校《大学计算机基础》教学中的因材施教
- 程序显示文本框_C++入门到精通(二),编写我们自己的Hello World程序
- AI安检:北航提出安检场景下的危险品检测基准和去遮挡注意力模块
- ICML 2021 | AlphaNet:基于α-散度的超网络训练方法
- 博士申请 | 上海交通大学叶南阳助理教授招收机器学习方向博士生
- 博士申请 | ​英属哥伦比亚大学李霄霄助理教授招收全奖博士生、硕士生
- 第四届AutoDL挑战赛——AutoSpeech2019正式开赛
- GCD LCM 欧几里得算法 扩展欧几里得算法
- 表白记 BFS求最短路径
- c语言自增自减5运算符详解,巧用C语言中的自增自减运算符