Android动画:插值器(Interpolator)前⾔
动画的使⽤ 是Android开发中常⽤的知识
种类繁多、使⽤复杂,每当需要采⽤⾃定义动画 实现 复杂的动画效果
采⽤⾃定义动画 实现 复杂的动画效果时,很多开发者就显得束⼿⽆策可是动画的种类繁多、使⽤复杂
Android中 补间动画 & 属性动画实现动画的原理是:
实现原理
其中,步骤2中的 插值器(Interpolator)和估值器(TypeEvaluator)是实现 复杂动画效果的关键
本⽂主要讲解 将详细讲解 插值器(Interpolator),通过阅读本⽂你将能轻松实现复杂的动画效果
关于Android动画的系列⽂章
动画的使⽤,请参考⽂章:
Android 属性动画:这是⼀篇很详细的 属性动画 总结&攻略
Android 动画:⼿把⼿教你使⽤ 补间动画
Android 逐帧动画:关于 逐帧动画 的使⽤都在这⾥了!
Android 动画:你真的会使⽤插值器与估值器吗?(含详细实例教学)
⾃定义View的原理,请参考⽂章:
(1)⾃定义View基础 - 最易懂的⾃定义View原理系列
(2)⾃定义View Measure过程 - 最易懂的⾃定义View原理系列
(3)⾃定义View Layout过程 - 最易懂的⾃定义View原理系列
(4)⾃定义View Draw过程- 最易懂的⾃定义View原理系列
⾃定义View的应⽤,请参考⽂章:
⼿把⼿教你写⼀个完整的⾃定义View
Path类的最全⾯详解 - ⾃定义View应⽤系列
Canvas类的最全⾯详解 - ⾃定义View应⽤系列
为什么你的⾃定义View wrap_content不起作⽤?
⽬录
⽰意图
1. 简介
定义:Android实现动画效果中的⼀个辅助接⼝
作⽤:设置 属性值 从初始值过渡到结束值 的变化规律
如匀速、加速 & 减速 等等
即确定了 动画效果变化的模式,如匀速变化、加速变化 等等
2. 应⽤场景
实现⾮线性运动的动画效果
⾮线性运动:动画改变的速率不是⼀成不变的,如加速 & 减速运动都属于⾮线性运动
3. 具体使⽤
插值器在动画的使⽤有两种⽅式:在XML / Java代码中设置:
3.1 XML设置
主要是设置插值器属性android:interpolator
<?xml version="1.0" encoding="utf-8"?>>
3.2 Java设置
Button mButton=(Button)findViewById(R.id.Button);// 步骤1:创建 需要设置动画的 视图ViewAnimation
alphaAnimation=newAlphaAnimation(1,0);// 步骤2:创建透明度动画的对象 & 设置动画效果
alphaAnimation.setDuration(3000);Interpolator overshootInterpolator=newOvershootInterpolator();// 步骤3:创建对应的插值器类对象alphaAnimation.setInterpolator(overshootInterpolator);// 步骤4:给动画设置插值器
mButton.startAnimation(alphaAnimation);// 步骤5:播放动画
那么使⽤插值器时的资源ID是什么呢?即有哪些类型的插值器可供我们使⽤呢?
插值器分为两种:Android内置默认 & ⾃定义,下⾯我将详细介绍
4. 系统内置插值器
4.1 类型
Android内置了 9 种内置的插值器实现:
canvas动画⽰意图
4.2 具体使⽤
当在XML⽂件设置插值器时,只需传⼊对应的插值器资源ID即可
当在Java代码设置插值器时,只需创建对应的插值器对象即可
系统默认的插值器是AccelerateDecelerateInterpolator,即先加速后减速
4.3 效果图
效果图
使⽤Android内置的插值器能满⾜⼤多数的动画需求
如果上述9个插值器⽆法满⾜需求,还可以⾃定义插值器
下⾯将介绍如何⾃定义插值器(Interpolator)
5. ⾃定义插值器
5.1 本质
根据动画的进度(0%-100%)计算出当前属性值改变的百分⽐
5.2 实现⽅式
⾃定义插值器需要实现Interpolator/TimeInterpolator接⼝ & 复写getInterpolation()
补间动画 实现Interpolator接⼝;属性动画实现TimeInterpolator接⼝
TimeInterpolator接⼝是属性动画中新增的,⽤于兼容Interpolator接⼝,这使得所有过去的Interpolator实现类都可以直接在属性动画使⽤
// Interpolator接⼝publicinterfaceInterpolator{// 内部只有⼀个⽅法floatgetInterpolation(floatinput){// 参数说明// input值值变化范围是0-1,且随着动画进度(0% - 100% )均匀变化// 即动画开始时,input值 = 0;动画结束时input = 1// ⽽中间的值则是随着动画的进度(0% - 100%)在0到1之间均匀增加...// 插值器的计算逻辑returnxxx;// 返回的值就是⽤于估值器继续计算的fraction值,下⾯会详细说明}// TimeInterpolator接⼝// 同上publicinterfaceTimeInterpolator{floatgetInterpolation(floatinput);}
在学习⾃定义插值器前,我们先来看两个已经实现好的系统内置差值器:
匀速插值器:LinearInterpolator
先加速再减速 插值器:AccelerateDecelerateInterpolator
// 匀速差值器:
LinearInterpolator@HasNativeInterpolatorpublicclassLinearInterpolatorextendsBaseInterpolatorimplementsNativeInterpolatorFa ctory{// 仅贴出关键代码...publicfloatgetInterpolation(floatinput){returninput;// 没有对input值进⾏任何逻辑处理,直接返回// 即input值= fraction值// 因为input值是匀速增加的,因此fraction值也是匀速增加的,所以动画的运动情况也是匀速的,所以是匀速插值器}// 先加速再减速 差值器:
AccelerateDecelerateInterpolator@HasNativeInterpolatorpublicclassAccelerateDecelerateInterpolatorimplementsInterpolator,Nat iveInterpolatorFactory{// 仅贴出关键代码...publicfloatgetInterpolation(floatinput){return(float)
(s((input+1)*Math.PI)/2.0f)+0.5f;// input的运算逻辑如下:// 使⽤了余弦函数,因input的取值范围是0到1,那么cos函数中的取值范围就是π到2π。// ⽽cos(π)的结果是-1,cos(2π)的结果是1// 所以该值除以2加上0.5后,getInterpolation()⽅法最终返回的结果值还是在0到1之间。只不过经过了余弦运算之后,最终的结果不再是匀速增加的了,⽽是经历了⼀个先加速后减速的过程// 所以最终,fractio
n值 = 运算后的值 = 先加速后减速// 所以该差值器是先加速再减速的}}
对input值 根据动画的进度(0%-100%)通过逻辑计算 计算出当前属性值改变的百分⽐
从上⾯看出,⾃定义插值器的关键在于:对input值 根据动画的进度(0%-100%)通过逻辑计算 计算出当前属性值改变的百分⽐
下⾯我将⽤⼀个实例来说明该如何⾃定义插值器
5.3 实例说明
下⾯,我将写⼀个⾃定义Interpolator:先减速后加速。
步骤1:根据需求实现Interpolator接⼝
DecelerateAccelerateInterpolator.java
publicclassDecelerateAccelerateInterpolatorimplementsTimeInterpolator{@OverridepublicfloatgetInterpolation(floatinput) {floatresult;if(input<=0.5){result=(float)(Math.sin(Math.PI*input))/2;// 使⽤正弦函数来实现先减速后加速的功能,逻辑如下:// 因为正弦函数初始弧度变化值⾮常⼤,刚好和余弦函数是相反的// 随着弧度的
增加,正弦函数的变化值也会逐渐变⼩,这样也就实现了减速的效果。// 当弧度⼤于π/2之后,整个过程相反了过来,现在正弦函数的弧度变化值⾮常⼩,渐渐随着弧度继续增加,变化值越来越⼤,弧度到π时结束,这样从0过度到π,也就实现了先减速后加速的效果}else{result=(float)(2-Math.sin(Math.PI*input))/2;}returnresult;// 返回的result值 = 随着动画进度呈先减速后加速的变化趋势}}
步骤2:设置使⽤
MainActivity.java
mButton=(Button)findViewById(R.id.Button);// 创建动画作⽤对象:此处以Button为例
TranslationX();// 获得当前按钮的位置ObjectAnimator
animator=ObjectAnimator.ofFloat(mButton,"translationX",curTranslationX,300,curTranslationX);// 创建动画对象 & 设置动画// 表⽰的是:// 动画作⽤对象是mButton// 动画作⽤的对象的属性是X轴平移// 动画效果是:从当前位置平移到 x=1500 再平移到初始位置
animator.setDuration(5000);animator.setInterpolator(newDecelerateAccelerateInterpolator());// 设置插值器animator.start();// 启动动画
效果图
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论