文档章节

测试安卓动画插入器

lanfogz
 lanfogz
发布于 2015/06/26 15:00
字数 1330
阅读 243
收藏 3
点赞 0
评论 0



测试安卓动画插入器



六种插入器介绍:


<I>android.view.animation.Interpolator

interpolator

[in'tə:pəuleitə]  跟读 口语练习

n. 窜改者,插入器;内插程序


<C>android.view.animation.AccelerateInterpolator

accelerate

英 [ək'seləreɪt]   美 [ək'sɛləret]   全球发音 跟读 口语练习

vt. 使……加快;使……增速

vi. 加速;促进;增加

public float getInterpolation(float input) {

       if (mFactor == 1.0f) { // 默认: mFactor = 1.0f;

           return input * input; // x^2

       } else {

           return (float)Math.pow(input, 2 * mFactor);

       }

   }

   

   测试:在负方向一直减速递减到0,之后在正方向再一直加速递增

    注:对函数公式的测试,可以采用之间博文:自定义安卓函数曲线控件,从曲线变化趋势得到速率变化


<C>android.view.animation.DecelerateInterpolator

decelerate

英 [diː'seləreɪt]   美 [,di'sɛləret]   全球发音 跟读 口语练习

vi. 减速,降低速度

vt. 使减速

public float getInterpolation(float input) {

       float result;

       if (mFactor == 1.0f) {

           result = (float)(1.0f - (1.0f - input) * (1.0f - input));

       } else {

           result = (float)(1.0f - Math.pow((1.0f - input), 2 * mFactor));

       }

       return result;

   }

   

   测试:在1之前减幅递增,之后加幅递减

    

<C>android.view.animation.AccelerateDecelerateInterpolator

   public float getInterpolation(float input) {

       return (float)(Math.cos((input + 1) * Math.PI) / 2.0f) + 0.5f;

   }

   

   测试:2个数值之间为一个变化周期;在0到0.5之间为加幅递增,之后到1为减幅递增,之后又是加幅递减、减幅递减



<C>android.view.animation.CycleInterpolator

   public float getInterpolation(float input) {

       return (float)(Math.sin(2 * mCycles * Math.PI * input));

   }

    

   测试:速率在0到大概0.5之间递增,之后到大概0.7为减速,之后到0.9为负向加速,在到1为负向加速到0

<C>android.view.animation.LinearInterpolator

   public float getInterpolation(float input) {

       return input;

   }

效果:速率保持不变(动画进度与速率变化保持一致)

<C>android.view.animation.OvershootInterpolator

overshoot   报错

英 [əʊvə'ʃuːt]   美 [,ovɚ'ʃut]  跟读 口语练习

vt. 超越;打过头;把…做过头

vi. 射击越标;(飞机)滑出跑道;行动过火

n. 超越目标;行动过火

tension Amount of overshoot. When tension equals 0.0f, there is no overshoot and the interpolator becomes a simple deceleration interpolator.

超过的拉伸量。当拉伸为0时,这个插入器变成一个简单的减速插入器。

   public float getInterpolation(float t) {

       // _o(t) = t * t * ((tension + 1) * t + tension)

       // o(t) = _o(t - 1) + 1

       t -= 1.0f;

       return t * t * ((mTension + 1) * t + mTension) + 1.0f;

   }

测试(mTension = 2.0f;):0到0.5减幅递增到大概1.2,之后到1为减速至1

应用测试:

(某移动动画)

anim.setDuration(300);

anim.setInterpolator(new Interpolator() {

@Override

   public float getInterpolation(float input) {

System.out.println(input);

       return input;

   }

});

06-26 14:38:03.087: I/System.out(27427): 0.0

06-26 14:38:03.087: I/System.out(27427): 0.0

06-26 14:38:03.097: I/System.out(27427): 0.036666665

06-26 14:38:03.117: I/System.out(27427): 0.093333334

06-26 14:38:03.127: I/System.out(27427): 0.15

06-26 14:38:03.147: I/System.out(27427): 0.20666666

06-26 14:38:03.167: I/System.out(27427): 0.26333332

06-26 14:38:03.177: I/System.out(27427): 0.32

06-26 14:38:03.197: I/System.out(27427): 0.37666667

06-26 14:38:03.217: I/System.out(27427): 0.43333334

06-26 14:38:03.227: I/System.out(27427): 0.49

06-26 14:38:03.247: I/System.out(27427): 0.5466667

06-26 14:38:03.267: I/System.out(27427): 0.60333335

06-26 14:38:03.287: I/System.out(27427): 0.6566667

06-26 14:38:03.297: I/System.out(27427): 0.7133333

06-26 14:38:03.317: I/System.out(27427): 0.77

06-26 14:38:03.337: I/System.out(27427): 0.83

06-26 14:38:03.347: I/System.out(27427): 0.8833333

06-26 14:38:03.367: I/System.out(27427): 0.94

06-26 14:38:03.387: I/System.out(27427): 1.0

06-26 14:38:03.397: I/System.out(27427): 1.0

不同移动距离,300毫秒持续时间,插入器被调用总是21次。

修改getInterpolation实现为“return input*input;”,效果:动画在更短时间内达到位置

修改getInterpolation实现为“return input/2;”,效果:动画在指定时间内未达到位置,画面闪烁之后达到位置。


总结:


主要有三点:

1、Interpolator就是一个“变化率”,一个基本动画的“变化率”。

2、input是一个0.0f~1.0f的浮点类型

3、假设距离为S,时间为t,速度为v,都知道S=v*t

猜测Interpolator的工作原理是:

首先,动画需要将during持续时间分割,得到连续的时间片

然后,循环时间片,通过每个时间片的位置在整个持续时间的比值,即动画过程进度,再使用Interpolator得到一个即时速率

最后,用即时速率x时间片长度得到一次偏移量,即一帧前后图像的位置偏移量

有没有可能在动画时间尚未结束,而已经到达目的位置的可能?或动画时间结束时并未到达目的位置?

而且还有一个问题是:持续时间并不能总和实际的动画时间一致,那又对此如何处理呢?

猜测安卓采用的一种策略是:首先完成时间之间的动画过程,之后做后续的调整。

而观察以上所有插入器的特点得知:在0~1之间所经过的路径总是超过匀速通过的路径,即都保证了在动画结束时都可以达到指定位置。

最好的速率控制是:在相同时间内,自定义速率变化和匀速走过的路径是相同的。即就像两个人摩托一样,一个人保持匀速,一个人按照逻辑的变化速度(甚至晚会走),最后都同时达到,这个速度的控制逻辑就是最好的。

但设计一个函数公式时,不仅要考虑时间和面积,还要考虑移动端的运算性能,而事实上不可兼得也是可以理解的。


参考:

http://blog.sina.com.cn/s/blog_4a6c59d60100wznv.html (Android 动画之Interpolator插入器 )


© 著作权归作者所有

共有 人打赏支持
lanfogz
粉丝 2
博文 18
码字总数 29273
作品 0
南京
程序员
Android动画:献上一份详细 & 全面的动画知识学习攻略

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 06/06 ⋅ 0

Android 动画:这是一份详细 & 清晰的 动画学习指南

前言 动画的使用 是 开发中常用的知识 可是动画的种类繁多、使用复杂,每当需要 采用自定义动画 实现 复杂的动画效果时,很多开发者就显得束手无策 本文将献上一份动画的全面介绍攻略,包括动...

Carson_Ho ⋅ 05/03 ⋅ 0

Android开发权威指南(第2版)新书发布

《Android开发权威指南(第二版)》是畅销书《Android开发权威指南》的升级版,内容更新超过80%,是一本全面介绍Android应用开发的专著,拥有45章精彩内容供读者学习。  《Android开发权威指...

androidguy ⋅ 2013/09/05 ⋅ 0

Android程序测试(1)——新建一个简单的测试工程来测试已有的工程

因为程序测试方面是程序开发中非常重要的一方面,这里结合官方教程,来了解下Android程序是怎样进行测试的。 Android开发环境集成了一个容易使用但同时很强大的程序测试框架,通过这个框架,...

一路漫漫 ⋅ 2012/03/16 ⋅ 0

Android Transition Animation 过渡动画解析

本文主要译自 lgvalle 的 Material-Animations 的 README.MD,文中的源码见 Material-Animations。 Android 4.4.2 中引入了 Transition 过渡动画,不过那时的 API 的功能比较简单,只能对整个...

JohnnyShieh ⋅ 04/09 ⋅ 0

Android系统源码分析团体项目BeesAndroid正式上线啦

嗨,BeesAndroid开源技术小组正式成立啦,Bees,即蜜蜂,取义分享、合作与奉献的意思,这也是BeesAndroid小组的宗旨,我们第一个团体项目BeesAndroid也于2018年3月6日同步上线,该项目的前 ...

郭孝星 ⋅ 03/08 ⋅ 0

常见的四种Animation详解(深入可以制作效果动画)

anim.xml 放入res文件中自己创建,4种常用的动画效果,每个加入了注释 <?xml version="1.0" encoding="UTF-8"?> <set xmlns:android="http://schemas.android.com/apk/res/android"> <!-- T......

子曰疯 ⋅ 2013/11/21 ⋅ 1

Android动画曲线库AndroidEasingFunctions

Android动画曲线库AndroidEasingFunctions AndroidEasingFunction是基于Easing Function(缓动函数)的Android动画曲线库。它提供了九大类27种动画曲线效果,可以使对应的属性按照时间进行变...

大学霸 ⋅ 05/17 ⋅ 0

Android属性动画基础:你是否真的了解插值器(TimeInterpolator)

  插值器和估值器是我们可以改变动画更新值的两个切入点,通过自定义插值器和估值器,我们可以随意改变动画更新时值的计算方式以满足我们特定的需求。本文简单介绍属性动画插值器(TimeInte...

乱世白衣 ⋅ 05/31 ⋅ 0

Android动画效果 translate、scale、alpha、rotate

Android的动画效果分为两种,一种是tweened animation(补间动画),第二种是frame by frame animation。 一般我们用的是第一种。补间动画又分为AlphaAnimation,透明度转换 RotateAnimation,...

黑马108 ⋅ 2012/10/19 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

博客迁移到 https://www.jianshu.com/u/aa501451a235

博客迁移到 https://www.jianshu.com/u/aa501451a235 本博客不再更新

为为02 ⋅ 33分钟前 ⋅ 0

win10怎么彻底关闭自动更新

win10自带的更新每天都很多,每一次下载都要占用大量网络,而且安装要等得时间也蛮久的。 工具/原料 Win10 方法/步骤 单击左下角开始菜单点击设置图标进入设置界面 在设置窗口中输入“服务”...

阿K1225 ⋅ 今天 ⋅ 0

Elasticsearch 6.3.0 SQL功能使用案例分享

The best elasticsearch highlevel java rest api-----bboss Elasticsearch 6.3.0 官方新推出的SQL检索插件非常不错,本文一个实际案例来介绍其使用方法。 1.代码中的sql检索 @Testpu...

bboss ⋅ 今天 ⋅ 0

informix数据库在linux中的安装以及用java/c/c++访问

一、安装前准备 安装JDK(略) 到IBM官网上下载informix软件:iif.12.10.FC9DE.linux-x86_64.tar放在某个大家都可以访问的目录比如:/mypkg,并解压到该目录下。 我也放到了百度云和天翼云上...

wangxuwei ⋅ 今天 ⋅ 0

PHP语言系统ZBLOG或许无法重现月光博客的闪耀历史[图]

最近在写博客,希望通过自己努力打造一个优秀的教育类主题博客,名动江湖,但是问题来了,现在写博客还有前途吗?面对强大的自媒体站点围剿,还有信心和可能型吗? 至于程序部分,我选择了P...

原创小博客 ⋅ 今天 ⋅ 0

IntelliJ IDEA 2018.1新特性

工欲善其事必先利其器,如果有一款IDE可以让你更高效地专注于开发以及源码阅读,为什么不试一试? 本文转载自:netty技术内幕 3月27日,jetbrains正式发布期待已久的IntelliJ IDEA 2018.1,再...

Romane ⋅ 今天 ⋅ 0

浅谈设计模式之工厂模式

工厂模式(Factory Pattern)是 Java 中最常用的设计模式之一。这种类型的设计模式属于创建型模式,它提供了一种创建对象的最佳方式。 在工厂模式中,我们在创建对象时不会对客户端暴露创建逻...

佛系程序猿灬 ⋅ 今天 ⋅ 0

Dockerfile基础命令总结

FROM 指定使用的基础base image FROM scratch # 制作base image ,不使用任何基础imageFROM centos # 使用base imageFROM ubuntu:14.04 尽量使用官方的base image,为了安全 LABEL 描述作...

ExtreU ⋅ 昨天 ⋅ 0

存储,对比私有云和公有云的不同

导读 说起公共存储,很难不与后网络公司时代的选择性外包联系起来,但尽管如此,它还是具备着简单和固有的可用性。公共存储的名字听起来也缺乏专有性,很像是把东西直接堆放在那里而不会得到...

问题终结者 ⋅ 昨天 ⋅ 0

C++难点解析之const修饰符

C++难点解析之const修饰符 c++ 相比于其他编程语言,可能是最为难掌握,概念最为复杂的。结合自己平时的C++使用经验,这里将会列举出一些常见的难点并给出相应的解释。 const修饰符 const在c...

jackie8tao ⋅ 昨天 ⋅ 0

没有更多内容

加载失败,请刷新页面

加载更多

下一页

返回顶部
顶部