android 属性动画变大,Android PropertyAnimation 属性动画(一)初探
8种机械键盘轴体对比
本人程序员,要买一个写代码的键盘,请问红轴和茶轴怎么选?
前言
相对于静态的页面,动画往往能更直观地表达所需的信息,在UI开发过程中起着相当大的作用。
Android为我们提供了一系列实现动画效果的方法,PropertyAnimaiton是最常见也是最实用的一种,如同它的名字一样,它的实现方式是通过改变对象的一系列属性值来改变对象的状态, 例如动态地改变绘制的位置就可以实现绘制物体的移动效果,动态地改变对象的显示状态可以实现闪烁效果。
Animator概览
Android提供的实现属性动画的工具是android.animation.Animator这个类,它的使用需要配合animation包下的其他工具类,这个类的功能是什么,我们要如何使用它来实现属性动画呢?
我们可以将Animator理解为Android为我们提供的一个按我们的需要在一定时间段内连续地计算并返回值的工具,这个值可以是通用的整型、浮点型,也可以是我们自定义的类型。
我们可以设置返回值的范围,并可以控制值变化的快慢,例如实现自由落体下落的物体时我们需要让高度值以一个越来越快的速度降低。
这里的连续需要注意,实际上是不可能产生真正意义上的连续值的,但是如果在绘制过程中计算这个值的速度小于绘制一帧所需要的时间,那么我们就可以在视觉上认为这个值是在连续改变的。这一点也是理解其作用的关键:我们很难去写出一个可以随时获取连续值的工具,而Animator正是一个满足我们这个需求的一个通用工具。
通过将Animator与View的绘制过程结合,就可以实现绝大多数的动画效果, 但是Animator也不只局限在使用在绘制动画,只要是有相似需求的地方都可以使用它来实现, 同时由于属性动画只针对属性进行修改,与被修改对象之前几乎没有耦合,不需要对被修改对象作出改变,可以设置方式也多种多样,这些都是动画的另一种实现方法ViewAnimator所无法做到的,所以我属性动画是现在实现动画效果的普遍做法。
使用Animator
Animator子类
下面就来看看如何使用Animator满足我们的需求。
我们使用Animator可以分为两个步骤,一是进行数值的计算,二是将计算出的数值设置到对应的对象上。而Animator有着三个子类:ValueAnimator ObjectAnimator AnimatorSet。ValueAnimator实现了上述过程的第一个步骤:进行数值的计算。第二个步骤则需要我们重写它的回调在值发生改变时候手动地为对象更新属性值。
ObjectAnimator则在其基础上进行了进一步的封装,加入了一些方法使得它可以绑定一个对象,在数值改变的同时对对象的属性进行更新。
AnimatorSet可以对Animator进行组合,让它们之间进行联动,例如可以设置一个动画根据另一个动画的状态来决定是否开始、暂停或停止。
可以看到,ValueAnimator提供了一个Animator最核心的内容,也是使用中最为灵活的一个。ObjectAnimator由于绑定了相应的对象,在使用上会受一些限制。AnimatorSet专用于需要组合动画的场景。
ValueAnimator
在这篇博客中,我们关注最为核心的ValueAnimator。
关键属性
ValueAnimator对象内部维护了一系列属性来保存所需的各种信息。Duration:动画的持续时间,通过setDuration()方法设置
Repeat count and behavior:重复计数与重复模式,我们可以通过设置这两个属性来控制动画是否重复以及重复的次数,通过setRepeatCount()与setRepeatMode()方法设置
Frame refresh delay:帧刷新延迟,也就是计算两帧动画之间的间隔时间,但这个时间只是Animator尽力去保持的值,具体的间隔时间会由于系统负载与性能的不同而不同,同时设置它的方法为一个静态方法:ValueAnimator.setFrameDelay(),会被设置到所有的Animator上,这是因为这些Animator都在同一个时间循环中。这个属性也有可能会被忽略如果动画系统采用了内部的计时来源,例如vsync来计算属性。同时这个方法需要在与start()方法相同的进程中调用
Time interpolation:时间插值器,是我们实现不同动画效果的关键,每一时刻所返回的数值由它决定,后文会详细讲
初始化与TypeEvaluator
ValueAnimator对象的构造函数只由内部使用,获取ValueAnimator对象的方法是调用它的工厂方法:
ValueAnimator.ofArgb()
ValueAnimator.ofInt()
ValueAnimator.ofFloat()
ValueAnimator.ofObject()
ValueAnimator.ofPropertyValuesHolder() //本篇未涉及,下一篇进行讲解
前三个可以看作是ValueAnimator为我们提供的初始化方式,它们的参数都是对应类型的长度可变参数:(Type ...values),我们需要提供一个以上的参数,ValueAnimator最终提供的值会在这些值之前变动。
一般情况下这里提供的Argb(用于颜色值的变化)和整型、浮点值基本可以满足我们的需求,但是某些时候我们需要结果是我们自定义的一些对象,这个时候就需要用到TypeEvaluator<>接口了,与这个接口对应的工厂方法是ValueAnimator.ofObject():1
2ValueAnimator (TypeEvaluator evaluator,
Object... values)
这里的可变参数类型变为了Object,同时还需要我们提供一个TypeEvaluator<>,用于“告诉”Animator如何返回这个Object值。
TypeEvaluator<>接口并不复杂,只有一个方法需要我们重写:1
2
3T evaluate (float fraction,
T startValue,
T endValue)
startValue与endValue非常好理解,就是我们在获取Animator时指定的值的起始值和结束值。类型与返回类型一致,当然都是我们自定义的类型。
这里的fraction就是决定我们最终返回值的关键参数。我们可以把这个fraction理解为animator提供给我们的最终的数值改变的比例,以小数表示,小于0表示低于startValue,大于0表示超出endValue,0-1之间表示在startValue与endValue之间。我们要做的就是把这个值转换为在起始和结果范围之间的合适的对象值。
例如,对于基本的浮点类型,默认的FloatEvaluator是这样的:1
2
3
4public Float evaluate(float fraction, Number startValue, Number endValue){
float startFloat = startValue.floatValue();
return startFloat + fraction * (endValue.floatValue() - startFloat);
}
可以看到,就是相当于把fraction所表示的比例“投射”到了我们所需要的数据对象上,这里是浮点类型。如果使用我们的自定义类型,我们必须为自己的类型定义这样的操作。
注意:这里要求我们必须将fraction线性地反应到对应的类型上,因为fraction反映的是最终的动画进度,我们必须如实地按照这个进度改变我们的属性,所以需要将result = x0 + t * (x1 - x0)`这样的形式反映到我们自己的对象上。
自定义了TypeEvaluator以后就可以作为参数使用在上面的obObject()工厂方法中了。
插补细分器(Interpolators)
下面介绍使用ValueAnimator控制值变化过程中最为重要的一个概念:插补细分器(Interpolators)。
它实际上是一个关于时间的函数, 根据时刻的不同来返回不同的值,进而来控制最后的输出的值。那么它是如何表示的呢?
系统为我们提供了一系列预置的Interpolators,以较常用的LinearInterpolater为例,顾名思义,它是一个线性的插补细分器,意味着输入与输出呈线性关系:1
2
3public float getInterpolation(float input){
return input;
}
输入输出的关键函数就是这个getInterpolation()了,可以看到,参数与返回值都是float类型,input的值在0-1之间,结合前面,我们可以很容易理解,这个input就是一个以0-1之间的小数表示的过去的时间值,例如整个动画是1000ms,当input为0.25的时候意味着现在的时间过去了250ms。
而返回值就是经过我们的转换,表示出的动画应该进行的时间的比例,这里由于是线性的,所以可以直接返回input,这个值最后会到哪里呢?自然就是给我们前面介绍的TypeEvaluator。下面一段源码展示了这个过程:1
2
3
4
5if (mInterpolator != null) {
fraction = mInterpolator.getInterpolation(fraction);
}
return mEvaluator.evaluate(fraction, mFirstKeyframe.getValue(),
mLastKeyframe.getValue());
作为getInterpolation()参数的fraction代表着过去的时间比例,这里调用我们设置的Interpolator来更新这个fraction,现在这个fraction表示的就是动画已经进行的比例,下一步就要根据它来获取对应的对象值(调用了我们之间谈到过的evaluate()方法,这里的KeyFrame的概念会在之后的博客讲到),后面的两个参数就是传递给evaluate的起始与结束范围。
最终,我们就获得了一个按照我们设定的Interpolator返回的动画属性值。
如果想要实现加速效果呢?Android同样为我们提供了现成的AccelerateInterpolator:1
2
3
4
5
6
7public float getInterpolation(float input){
if (mFactor == 1.0f) {
return input * input;
} else {
return (float)Math.pow(input, mDoubleFactor);
}
}
同样很简洁,这里用到了mFactor与mDoubleFactor分别表示我们在构造函数里面设置的指数值:1
2
3
4public AccelerateInterpolator(float factor){
mFactor = factor;
mDoubleFactor = 2 * mFactor;
}
如果我们设置的为1,会返回input的平方,其他值则会返回input的mDoubleFactor次方,使得动画属性可以以不同的函数曲线形式变化。
如果我们要实现自己的Interpolator呢?只需要实现TimeInterpolator接口,这个接口只需要我们实现一个getInterpolation方法。我们可以根据input值返回不同的值来返回不同的值表示动画的进度。
注意:返回值的范围不一定要在0-1之间,小于0或大小1的值可以表示超出预设范围的目标值。
这篇博客到此结束,在下一篇博客中将会以一个绘制自由落体的弹跳小球的示例来演示如何使用Animator与介绍它的回调函数。
android 属性动画变大,Android PropertyAnimation 属性动画(一)初探相关推荐
- android webview内容变大,Android中WebView加载的网页被放大的解决办法
在某些大分辨率下,我们用WebView加载的网页可能会出现被放大的现象,这显然不是我们想要的结果,我开始看WebSettings这个是否可以设置不缩放,webSettings.setBuiltInZo ...
- android老人字体变大,适合老年人用的安卓手机软件 一键让Android字体变大
话说现在安卓手机已经非常的普及了,而且使用起来确实很方便,可是对于老年人来说,而且Android默认的小字体实在是个莫大的折磨,那么有没有什么软件可以使Android字体变大呢?嘿嘿,今天小编就为大家 ...
- android老人字体变大,孝敬父母不必老人机!调大安卓字体教程
有孝心的朋友一定为数不少,但要买部手机孝敬父母,往往只能选择非智能的老人手机,毕竟现在智能手机的分辨率是越做越高,字体看上去往往也越来越小,老爸爸老妈妈们没有这么好的视力了.然而,用普通的老人手机,长 ...
- android edittext光标太大,Android中EditText样式修改 聚焦光标、背景
在Android开发中,根据项目的需求,需要定制一些特殊的样式,例如:使用EditText时,聚焦时的背景及光标图片使用自定义而非android系统默认的.这两天,在项目中涉及此需求,现记录如下: 首 ...
- android自定义tab下划线变大,android设置tablayout下划线长度代码
设置tablayout下划线长度的方法(android.support.design.widget.TabLayout) public static void setIndicator(Context ...
- android自定义tab下划线变大,Android开发之设置TabLayout下方下划线的宽度
由于最近项目需要,需要设置tabLayout下方下划线的长度.笔者上网找了半天,也没有找到方法.后来了解到在源码中对tabLayout的下划线进行了设置.并没有方法可以直接设置. 然后,笔者看到了某位 ...
- android 字体慢慢变大 网易新闻,网易新闻怎么设置字体大小
网易新闻是一个十分不错的新闻阅读平台,无论是头条新闻还是娱乐新闻还是地区新闻这里都能够满足到小伙伴们,同时网易新闻可以根据自己的喜好来设置字体的大小和样式哦,那么网易新闻该怎么设置字体大小呢?下面小编 ...
- android 字体慢慢变大 网易新闻,网易新闻如何设置字体大小?网易新闻字体大小设置方法一览...
网易新闻是一款备受小伙伴们青睐的手机新闻软件,自上线以来就吸粉无数!近日,不少玩家在问网易新闻如何设置字体大小?下面我们就来一起看看网易新闻字体大小的设置方法吧!!! 网易新闻如何设置字体大小? 1. ...
- android 字体慢慢变大 网易新闻,如何在网易新闻中设置字体大小?在网易新闻中设置字体大小的方法...
大家经常使用网易新闻吧,我们可以在里面查看许多新的消息,下面小编给大家分享一下在网易新闻中设置字体大小的方法,希望会对你有所帮助. 1.打开网易新闻客户端,进入网易新闻主界面后,在主界面中可以看到当天 ...
最新文章
- python-ubuntu
- [leetcode]19.删除链表的倒数第N个节点
- Android Activity绑定到Service
- 解决krpano全景视频在QQ浏览器、安卓不能正常播放的问题
- Lc695-岛屿的最大面积
- 迅捷cad_迅捷属性
- txt文件参数化200用户,返回在表格中查看只能看到100行数据
- 架构师必备最全SQL优化方案
- PHP表单入库处理,ThinkPHP收集表单数据入库操作(三种方式)
- 20191221每日一句
- 广发银行网上银行安全控件官方版
- c语言实数的输出和占位_C语言输出格式总结
- java基于springboot的酒店预约管理平台系统
- 短文本相似度计算-simHash从原理到实现
- 计算机用通讯电压多少,通信局(站)用交流电源的质量指标要求
- 线索树找*p的中序后继且中序遍历 二叉线索树
- excel与access结合运用_access和excel结合应用
- python学生成绩管理系统【完整版】
- sourcetree远端 红色叹号
- IDEA连接mysql又报错!Server returns invalid timezone. Go to 'Advanced' tab and set 'serverTimezone' prope
热门文章
- C#通过DllImport引入dll中的C++非托管类
- python数据结构《排序专题复习》
- 两数之和 python_同一屏幕播放两个视频 视频左右两个画面或视频上下两个画面如何制作...
- pb 如何导出csv_Firefox火狐浏览器将提供导出密码至本地的功能
- 漫步者lollipods如何调节音量_漫步者MF5扩音器体验:老师值得入手
- 【bzoj2500】幸福的道路 树形dp+倍增RMQ+二分
- JavaScript 经典实例日常收集整理(常用经典)
- 线程同步以及yield()、wait()、Notify()、Notifyall()
- (转)mssql2005生成表字典
- 最近做了一个安装包的安装流程图