Android-View Animation(视图动画)

     Android系统提供了两种动画框架:property动画(属性动画)和View动画(视图动画)。这两个动画系统都是可行的方案,但在一般情况下,属性动画系统被优先使用,因为它更灵活,并且提供了更多的功能,除了两个动画系统之外,也可以利用Drawable动画,它允许加载Drawable资源,一帧一帧的显示这些Drawable资源。
     这里先学习View动画,Android View Animamtion包括两种:Tween和frame。
一、Tween动画简单介绍:
    Tween动画(补间动画)根据一些信息来计算动画,如:起点(start point)、终点(end point)、尺寸(size)、旋转(rotation)和动画的其他共同点,可以在视图对象的内容上进行一系列简单的变换(位置、大小、旋转、透明度)。比如,如果有一个TextView对象,就可以移动、旋转、放大或者缩小它,如果它还有一张背景图,背景图则和它一起变换。
    Tween动画属性通常定义在XML文件中,其路径:res/anim/filename.xml。如:    
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:interpolator="@[package:]anim/interpolator_resource"
    android:shareInterpolator=["true" | "false"] >
    <alpha
        android:fromAlpha="float"
        android:toAlpha="float"/>
    <scale
        android:fromXScale="float"
        android:toXScale="float"
        android:fromYScale="float"
        android:toYScale="float"
        android:pivotX="float"
        android:pivotY="float"/>
    <translate
        android:fromXDelta="float"
        android:toXDelta="float"
        android:fromYDelta="float"
        android:toYDelta="float"/>
    <rotate
        android:fromDegrees="float"
        android:toDegrees="float"
        android:pivotX="float"
        android:pivotY="float"/>
    <set>
        ...
    </set>
</set>
    xml文件必须有一个root元素,要么是 <alpha>, <scale>, <translate>, <rotate>, 或者<set> 元素,该元素持有一组(或多组)其他动画元素(甚至嵌套的<set>元素)。
各元素介绍:
    1)<set>:一个持有其他动画元素的容器,表示一个AnimationSet(一个类,可在源码中找到)。
      <set>属性参数:
          android:interpolator:interpolator(插值器)资源,一个Interpolator 应用在动画上,它的值必须引用指向一个interpolator的资源(不是一个interpolator的类名)。在Android平台上有默认的interpolator资源可用,或者创建自己的interpolator资源。
          android:shareInterpolator:其值为布尔类型。如果你想要在所有的子元素中共享同一个interpolator,其值为“true”。
     2)<alpha>:淡入或淡出动画。表示一个AlphaAnimation(类)。
      <alpha>属性参数:
          android:fromAlpha:其值为Float类型,表示起点不透明度偏移,0.0表示透明,1.0表示不透明。
          android:toAlpha:其值为Float类型,表示终点不透明度偏移,0.0表示透明,1.0表示不透明。
     3)<scale>:表示一个伸缩动画,可以通过指定pivotX和pivotY来指定image向外和向内伸缩的中心点。比如:pivotX和pivotY为0和0(左上角),这意味着所有的伸展将向下和向右。这个元素表示一个ScaleAnimation(类)。
        <scale>属性参数:
            android:fromXScale:其值为Float类型,表示起点X轴偏移量,其值为1.0表示没有任何变化。
            android:toXScale:其值为Float类型,表示终点X轴偏移量,其值为1.0表示没有任何变化。
            android:fromYScale:其值为Float类型,表示起点Y轴偏移量,其值为1.0表示没有任何变化。   
            android:toYScale:其值为Float类型,表示终点Y轴偏移量,其值为1.0表示没有任何变化。
            android:pivotX:其值为Float类型,表示,当对象缩放时,X坐标保持固定。
            android:pivotY:其值为Float类型,表示,当对象缩放时,Y坐标保持固定。
     4)<translate>:垂直和/或水平运动,支持一下任何三种格式:值的范围从-100到100,并以“%”结束,表示相对于自身的百分比;值的范围从-100到100,并以“%p“结束,表示相对于其父类属性额百分比;值为没有后缀的Float类型,表示一个TranslateAnimation(类)。
        <translate>属性参数:
           android:fromXDelta:值为Float类型或者百分比。起点X轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
           android:toXDelta:值为Float类型或者百分比。终点X轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
          android:fromYDelta:值为Float类型或者百分比。起点Y轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
          android:toYDelta:值为Float类型或者百分比。终点Y轴的偏移量。要么以像素为单位表示相当于正常位置的值(如"5"),要么以百分比为单位表示相对于该元素宽度的百分比值(如:5%),要么以百分比为单位表示相对于父元素宽度的百分比值(如:“5%p”)。
    5)<rotate>:一个旋转动画。表示一个RotateAnimation(类)。
        <rotate>属性参数:
            android:fromDegrees:值为Float类型,表示起点的角度位置,以度为单位。
            android:toDegrees:值为Float类型,表示终点的角度位置,以度为单位。
            android:pivotX:值为Float类型或者百分比,指示旋转中心的X轴坐标。要么以像素为单位表示相对于对象左边缘的值(如:“5”),要么以百分比为单位表示相对于对象左边缘的值(如:“5%”),要么以百分比为单位表示相对于其父容器元件的左边缘的值(如“5%p”)。
            android:pivotY:值为Float类型或者百分比,指示旋转中心的Y轴坐标。要么以像素为单位表示相对于对象顶边的值(如:“5”),要么以百分比为单位表示相对于对象顶边的值(如:“5%”),要么以百分比为单位表示相对于其父容器元件顶边的值(如“5%p”)。

其他XML属性参数:    
XML Attributes
Attribute Name
Related Method
Description
android:detachWallpaper setDetachWallpaper(boolean) Window动画的特殊选项,如果这个window在墙纸的上面,则不让墙纸与它一起有动画效果。 
android:duration setDuration(long) 动画运行的时间(以毫秒为单位). 
android:fillAfter setFillAfter(boolean) 如果设置为true,在动画结束之后,动画变换才被应用。 
android:fillBefore setFillBefore(boolean)  如果设置为true或者fillEnabled未设置为true,在动画开始前,动画变换被应用。
android:fillEnabled setFillEnabled(boolean) 如果设置为true,fillBefore的值也被考虑在内。
android:interpolator setInterpolator(Interpolator) 设置interpolator
android:repeatCount setRepeatCount(int) 定义动画应该重复多少次。 
android:repeatMode setRepeatMode(int) Defines the animation behavior when it reaches the end and the repeat count is greater than 0 or infinite. 
android:startOffset setStartOffset(long) Delay in milliseconds before the animation runs, once start time is reached. 
android:zAdjustment setZAdjustment(int) Allows for an adjustment of the Z ordering of the content being animated for the duration of the animation. 
    interpolator说明:
    interpolator是一个动画调节器,定义在XML资源文件中,影响动画变化的速率。现有interpolator动画效果有:accelerated(加速)、decelerated(减速)、repeated(反复)、bounced(反弹)等。
Interpolator class Resource ID
AccelerateDecelerateInterpolator @android:anim/accelerate_decelerate_interpolator
AccelerateInterpolator @android:anim/accelerate_interpolator
AnticipateInterpolator @android:anim/anticipate_interpolator
AnticipateOvershootInterpolator @android:anim/anticipate_overshoot_interpolator
BounceInterpolator @android:anim/bounce_interpolator
CycleInterpolator @android:anim/cycle_interpolator
DecelerateInterpolator @android:anim/decelerate_interpolator
LinearInterpolator @android:anim/linear_interpolator
OvershootInterpolator @android:anim/overshoot_interpolator
如:
<setandroid:interpolator="@android:anim/accelerate_interpolator">
    ...
</set>
    自定义interpolators:
    如果不满意Android平台提供的interpolators(如上表),可以通过修改属性参数来自定义一个interpolator。例如:可以为AnticipateInterpolator调整加速度的速率,或为CycleInterpolator调整循环周期的数目。要做到这些,需要在XML中创建自己的interpolator资源。
    1)xml文件位置:res/anim/filename.xml。
    2)编译资源数据类型:资源指向对应的interpolator对象。
    3)资源引用:@[package:]anim/filename
    4)语法: 
<?xml version="1.0" encoding="utf-8"?>
<InterpolatorNamexmlns:android="http://schemas.android.com/apk/res/android"
    android:attribute_name="value"
    />
    如果在此xml资源文件中,不修改任何参数,那么这个interpolator就和它所指向的interpolator一样。
    5)元素:请注意每个Interpolator的实现,在XML中定义时,用小写的名称。
     <accelerateDecelerateInterpolator>:开始和结束时的变化速率缓慢,但是中间却会加速,无属性参数。例如:  
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">
<translate
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
/>
</set> 
hyperspaceAnimation = AnimationUtils.loadAnimation(this, R.anim.macceleratedecelerateinterpolator);
                                                        
    <accelerateInterpolator>:变换速率开始缓慢,然后加速。属性参数:android:factor:值为Float类型,表示加速度(默认为1). 例如:   
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/accelerate_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
        
      <anticipateInterpolator>:变换开始先向后,然后向前。属性参数:android:tension:表示提供的拉伸力度(默认为2),例如:    
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/anticipate_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
          
   <anticipateOvershootInterpolator>:变换开始向后,然后甩向前,然后渡过到目标值,最后稳定在最后的值。属性参数:android:tension:表示提供的拉伸力度(默认为2)。例如: 
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/anticipate_overshoot_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
/>
</set>
        
     <bounceInterpolator>:变换在结束时反弹。无属性参数。例如:
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/bounce_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
            
     <cycleInterpolator>:根据指定的循环数目重复动画,变换速率遵循正弦模式。属性参数:android:cycles:值为整型,表示循环的次数(默认为1)。 例如:   
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/cycle_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
android:repeatCount="0"
/>
</set>
       
  <linearInterpolator>:变换速率是恒定的,无属性参数。例如:    
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/linear_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="5000"
android:startOffset="700"
/>
</set>
         
    <overshootInterpolator>:变换甩向前,然后过渡到最后的值,然后返回。属性参数:android:tension:表示提供的拉伸力度(默认为2)。如:  
<set
android:shareInterpolator="false"
xmlns:android="http://schemas.android.com/apk/res/android">

<translate
android:interpolator="@android:anim/overshoot_interpolator"
android:fromXDelta="5"
android:toXDelta="50%p"
android:fromYDelta="5"
android:toYDelta="50%p"
android:duration="2000"
android:startOffset="700"
/>
</set>
hyperspaceAnimation = AnimationUtils.loadAnimation(this, R.anim.movershootinterpolator);
mImageView.startAnimation(hyperspaceAnimation);
                
关于interpolator,有兴趣可以参考一下这篇博客:http://www.cnblogs.com/mengdd/p/3346003.html

二、Frame动画(帧动画):
    1)资源文件位置:res/drawable/filename.xml(filename将被用作此资源的ID)
    2)编译资源数据类型:资源指向AnimationDrawable。
    3)语法:    
<?xml version="1.0" encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot=["true" | "false"] >
    <item
        android:drawable="@[package:]drawable/drawable_resource_name"
        android:duration="integer"/>
</animation-list>
    4)元素:
        <animation-list>:这必须是root元素,包含一个或多个<item>元素。
        属性参数:
          android:oneshot:值为布尔类型,如果值为true,表示动画只进行一次,如果值为false,表示循环动画。
        <item>:动画的单个帧,必须是<animation-list>元素子元素。
        属性参数:
            android:drawable:Drawable资源。
            android:duration:值为整数,表示frame动画持续的时间,以毫秒为单位。
举例:    
<?xml version="1.0" encoding="utf-8"?>
<animation-listxmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
    <itemandroid:drawable="@drawable/rocket_thrust1"android:duration="200"/>
    <itemandroid:drawable="@drawable/rocket_thrust2"android:duration="200"/>
    <itemandroid:drawable="@drawable/rocket_thrust3"android:duration="200"/>
</animation-list>
ImageView rocketImage =(ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

rocketAnimation =(AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
frame 动画和Drawable Animation很像。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值