使用的Demo:
<setxmlns:androidsetxmlns:android="http://schemas.android.com/apk/res/android"
android:shareInterpolator="false"]]>
<scale
android:interpolator="@android:anim/accelerate_decelerate_interpolator"
android:fromXScale="1.0"
android:toXScale="1.4"
android:fromYScale="1.0"
android:toYScale="0.6"
android:pivotX="50%"
android:pivotY="50%"
android:fillAfter="false"
android:duration="700"/>
<set
android:interpolator="@android:anim/accelerate_interpolator"
android:startOffset="700"]]>
<scale
android:fromXScale="1.4"
android:toXScale="0.0"
android:fromYScale="0.6"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400"/>
<rotate
android:fromDegrees="0"
android:toDegrees="-45"
android:toYScale="0.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="400"/>
</set>
</set>
//这个动画应用于ImageView
ImageView image =(ImageView) findViewById(R.id.image);
Animation hyperspaceJump =AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
image.startAnimation(hyperspaceJump);
```###Android动画的分类
Android动画分为:
1. 属性动画(Property Animation)
2. 视图动画(View Animation)
2.1补间动画(Tween Animation)
2.2帧动画(Frame Animation)
在XML中定义动画首先应该了解不同的动画的路径及调用方法:
> 属性动画XML路径: res/animator/filename.xml
> 在JAVA中调用:R.animator.filename
> 在XML中调用:@[package:]animator/filename
>补间动画XML路径:res/anim/filename.xml
> 在JAVA中调用:R.anim.filename
> 在XML中调用:@[package:]anim/filename
> 帧动画XML路径:res/drawable/filename.xml
> 在JAVA中调用:R.drawable.filename
> 在XML中调用:尽量不要在XML文件中调用(后文有补充)
>插值器的XML路径:res/anim/my_overshoot_interpolator.xml
>在XML文件中调用:@anim/my_overshoot_interpolator
<div class="se-preview-section-delimiter"></div>
###各种动画的简单使用
<div class="se-preview-section-delimiter"></div>
####属性动画
属性动画: 是在一段时间内改变属性的值产生的动画效果,例如背景颜色和alpha的值。属性动画可以定义在XML文件中。
属性动画的使用Tips:
> 这些xml文件定义的文件路径如下: res/animator/filename.xml
>常用java类: ValueAnimator, ObjectAnimator, or AnimatorSet.
>Property Animation定义在android.animation包种。
>Property Animation的文件可以以资源的形式引用:
>In Java: R.animator.filename
>In XML: @[package:]animator/filename
属性动画的使用(在XML文件中定义属性动画):
<div class="se-preview-section-delimiter"></div>
<set
android:ordering=["together" | "sequentially"]]]>
<objectAnimator
android:propertyName="string"
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<animator
android:duration="int"
android:valueFrom="float | int | color"
android:valueTo="float | int | color"
android:startOffset="int"
android:repeatCount="int"
android:repeatMode=["repeat" | "reverse"]
android:valueType=["intType" | "floatType"]/>
<set>
...
</set>
</set>
在Java中使用属性动画:
<div class="se-preview-section-delimiter"></div>
AnimatorSet set=(AnimatorSet)AnimatorInflater.loadAnimator(
myContext,
R.anim.property_animator);
set.setTarget(myObject);//myObject为要设置属性的对象
set.start();
<div class="se-preview-section-delimiter"></div>
####视图动画
视图动画包括补间动画和帧动画,由于这类动画只能作用在视图控件上,所以称之为试图动画。
<div class="se-preview-section-delimiter"></div>
####补间动画的使用 (Tween Animation)
Tween Animation定义在xml文件中。可以对view实现一系列的转换,例如:移动、渐变、伸缩、旋转。
值得注意的是:
>tips:补间动画的移动、渐变、伸缩、旋转的变化只是视觉上的变化,而其View本身的位置并没有发生变化。例如:它的点击事件无论你如何进行移动动画但是它还在其原来位置上响应点击事件。
举例看一下Tween Animation的xml文件:
<div class="se-preview-section-delimiter"></div>
<?xml version="1.0" encoding="utf-8"?>
<setxmlns:androidsetxmlns: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>
<div class="se-preview-section-delimiter"></div>
①在Tween中有一类重要的只是插值器(Interpolators):
Interpolators(插值器)可以让动画按照一定的频率运动,实现加速、加速、重复、回弹等效果。
android 自带的interpolator:
AccelerateDecelerateInterpolator 在动画开始与介绍的地方速率改变比较慢,在中间的时候加速
AccelerateInterpolator 在动画开始的地方速率改变比较慢,然后开始加速
AnticipateInterpolator 开始的时候向后然后向前甩
AnticipateOvershootInterpolator 开始的时候向后然后向前甩一定值后返回最后的值
BounceInterpolator 动画结束的时候弹起
CycleInterpolator 动画循环播放特定的次数,速率改变沿着正弦曲线
DecelerateInterpolator 在动画开始的地方快然后慢
LinearInterpolator 以常量速率改变
OvershootInterpolator 向前甩一定值后再回到原来位置
如果android定义的interpolators不符合你的效果也可以自定义interpolators
使用Android已有的插值器:
<set android:interpolator="@android:anim/ccelerateDecelerateInterpolator">
···// 定义想要的动画
</set>
<div class="se-preview-section-delimiter"></div>
②自定义的插值器
XML中定义:
<?xml version="1.0" encoding="utf-8"?>
<overshootInterpolator xmlns:android=
"http://schemas.android.com/apk/res/android"
android:tension="7.0"/>
<div class="se-preview-section-delimiter"></div>
自定义插值器常用的属性:
< 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
使用上述的自定义的插值器:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />
自定义插值器常用的属性:
< 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
使用上述的自定义的插值器:
<scale xmlns:android="http://schemas.android.com/apk/res/android"
android:interpolator="@anim/my_overshoot_interpolator"
android:fromXScale="1.0"
android:toXScale="3.0"
android:fromYScale="1.0"
android:toYScale="3.0"
android:pivotX="50%"
android:pivotY="50%"
android:duration="700" />
####帧动画(Frame Animation)
帧动画就是按照一定的顺序显示一定的图片。
文件路径:
res/drawable/filename.xml
直接进入Demo:
<?xml version="1.0" encoding="utf-8"?>
<animation-list xmlns: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>
```
//Frame Animation使用,首先设置为背景,然后再播放。
ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);
rocketImage.setBackgroundResource(R.drawable.rocket_thrust);
rocketAnimation = (AnimationDrawable) rocketImage.getBackground();
rocketAnimation.start();
使用Frame Animation注意一下问题:
1要在代码中调用Imageview的setBackgroundResource方法,如果直 接在XML布局文件中设置其src属性当触发动画时会FC。
2在动画start()之前要先stop(),不然在第一次动画之后会停在最后一帧,这样动画就只会触发一次。
3最后一点是SDK中提到的,不要在onCreate中调用start,因为AnimationDrawable还没有完全跟Window相关联,如果想要界面显示时就开始动画的话,可以在onWindowFoucsChanged()中调用start()。