注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

民主与科学

独立之人格,自由之思想

 
 
 

日志

 
 

Tween Animation动画之插值器interpolator  

2015-07-03 19:28:52|  分类: Android的UI开发 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
本文参照自:http://blog.csdn.net/liuhe688/article/details/6660823
android:interpolator 用于设置插值器interpolator 。首先要了解为什么需要插值器,因为在补间动画中,我们一般只定义关键帧(首帧或尾帧),然后由系统自动生成中间帧,生成中间帧的这个过程可以成为“插值”。插值器定义了动画变化的速率,提供不同的函数定义变化值相对于时间的变化规则,可以定义各种各样的非线性变化函数,比如加速、减速等。下面是几种常见的插值器,非常有用的属性,可以简单理解为动画的速度,可以是越来越快,也可以是越来越慢,或者是先快后忙,或者是均匀的速度等等。
@android:anim/accelerate_interpolator: 越来越快,它对应Android代码中的AccelerateInterpolator对象
@android:anim/decelerate_interpolator:越来越慢,对应Android代码中的AccelerateInterpolator对象
@android:anim/accelerate_decelerate_interpolator:先快后慢。对应Android代码中的AccelerateDecelerateInterpolator对象
@android:anim/anticipate_interpolator: 先后退一小步然后向前加速。
对应Android代码中的AnticipateInterpolator对象
@android:anim/overshoot_interpolator:快速到达终点超出一小步然后回到终点
@android:anim/anticipate_overshoot_interpolator:到达终点超出一小步然后回到终点。
@android:anim/bounce_interpolator:到达终点产生弹球效果,弹几下回到终点。
@android:anim/linear_interpolator:均匀速度。
@android:anim/cycle_interpolator:周期运动
示例4-1
my_anim_interpolator.xml文件(放在anim目录下

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator android:factor="2.5"
  xmlns:android="http://schemas.android.com/apk/res/android" />

my_anim_window_close_in.xml(放在anim目录下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillBefore="true"
    android:fillEnabled="true"
    android:interpolator="@anim/my_anim_interpolator"
    android:shareInterpolator="true"
    android:zAdjustment="bottom" >

    <translate
        android:duration="1000"
        android:fillAfter="true"
        android:fillBefore="true"
        android:fillEnabled="true"
        android:fromXDelta="0.0%p"
        android:toXDelta="100.0%p" />

</set>

android:shareInterpolator代表<set>里面的多个动画是否要共享插值器,默认值为true,即共享插值器,如果设置为false,那么<set>的插值器就不再起作用,我们要在每个动画中加入插值器。
如果只简单地引用这些插值器还不能满足需要的话,我们要考虑一下个性化插值器。我们可以创建一个插值器资源修改插值器的属性,比如修改AnticipateInterpolator的加速速率,调整CycleInterpolator的循环次数等。为了完成这种需求,我们需要创建XML资源文件,然后将其放于/res/anim下,然后再动画元素中引用即可。我们先来看一下几种常见的插值器可调整的属性:
<accelerateDecelerateInterpolator> 无
<accelerateInterpolator> android:factor 浮点值,加速速率,默认为1
<anticipateInterploator> android:tension 浮点值,起始点后退的张力、拉力数,默认为2
<anticipateOvershootInterpolator> android:tension 同上 android:extraTension 浮点值,拉力的倍数,默认为1.5(2  * 1.5)
<bounceInterpolator> 无
<cycleInterplolator> android:cycles 整数值,循环的个数,默认为1
<decelerateInterpolator> android:factor 浮点值,减速的速率,默认为1
<linearInterpolator> 无
<overshootInterpolator> 浮点值,超出终点后的张力、拉力,默认为2
下面我们就拿两个插值器来举例
示例4-1
<?xml version="1.0" encoding="utf-8"?>  
<overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"  
    android:tension="7.0"/>  

上面的代码中,我们把张力改为7.0,然后将此文件命名为my_overshoot_interpolator.xml,放置于/res/anim下,我们就可以引用到自定义的插值器了:

<scale xmlns:android="http://schemas.android.com/apk/res/android"  
    android:interpolator="@anim/my_overshoot_interpolator"  
    .../>  

示例4-2
my_anim_interpolator.xml文件(放在anim目录下

<?xml version="1.0" encoding="utf-8"?>
<decelerateInterpolator android:factor="2.5"
  xmlns:android="http://schemas.android.com/apk/res/android" />

my_anim_window_close_in.xml(放在anim目录下

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillBefore="true"
    android:fillEnabled="true"
    android:interpolator="@anim/my_anim_interpolator"
    android:shareInterpolator="true"
    android:zAdjustment="bottom" >

    <translate
        android:duration="1000"
        android:fillAfter="true"
        android:fillBefore="true"
        android:fillEnabled="true"
        android:fromXDelta="0.0%p"
        android:toXDelta="100.0%p" />

</set>
如果以上这些简单的定义还不能满足我们的需求,那么我们就需要考虑一下自己定义插值器类了。
我们可以实现Interpolator接口,因为上面所有的Interpolator都实现了Interpolator接口,这个接口定义了一个方法:float getInterpolation(float input);
此方法由系统调用,input代表动画的时间,在0和1之间,也就是开始和结束之间。
线性(匀速)插值器定义如下:

public float getInterpolation(float input) {  
    return input;  
}  

加速减速插值器定义如下:

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

  评论这张
 
阅读(395)| 评论(0)
推荐 转载

历史上的今天

在LOFTER的更多文章

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017