Android中的动画资源

来源:互联网 发布:apriori算法 置信度 编辑:程序博客网 时间:2024/06/05 23:54

Android中的动画资源包含两种类型的动画:
1. 属性动画 Property Animation
创建一个动画对象,然后修改对象的属性值,这是基于一定时间的动画。
2. 视图动画 View animation
可以使用视图动画框架(view animation framework)来制作两种类型的动画:

   1.  补间动画 Tween animation  : 创建一个动画,通过执行一系列的转换单张图片,具有一个动画效果   2.  帧动画 Frame animation :创建一个动画,通过顺序地展示一些列图片(图片不只1张)

1 属性动画:

在XML中定义动画,通过修改目标对象的属性,比如背景颜色,或透明度值 ,它是基于一段时间的。文件位置:res/animator/filename.xml文件名会被作为一个资源ID使用编译资源的数据类型:资源指向一个 ValueAnimator, ObjectAnimator 或 AnimatorSet资源引用方式:    java中:R.animator.filename    xml中:@[package:]animator/filename语法:
<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>

该文件必须只有一个根元素:要么是<set> ,<objectAnimator>,要么是<valueAnimator>

同时可以在元素内部,对动画进行分组或包含其他的元素

元素:
<set>: 一个容器,支持其他动画元素(<objectAnimator>, <valueAnimator>或其他 <set> 元素),代表一个动画集。可以嵌套标签,进一步分组动画。每一个能定义它自己的 ordering 属性
属性:android:ordering 该关键字,标识了在动画集中动画播放的顺序
值:sequentially 按顺序播放动画 值:together (default) 同时播放动画

<objectAnimator> 使一个对象的特定属性在一定时间动画化,代表了一个ObjectAnimator.属性:android:propertyName 要求是字符串。使对象的属性动画化,通过引用它的名字。例如,你可以为一个视图对象指定alpha或backgroundColor。该objectAnimator 不会暴露一个目标属性,然而不能在XML声明中设置对象到动画,必须通过调用 loadAnimator() 来加载动画XML资源,并调用 setTarget() 去设置包含该属性的目标对象。android:valueTo 要求是float, int, or color 值。是动画属性结束的值,颜色用6个十六进制数表示,如#333333。android:valueFrom 要求是 float, int 或 color 值。是动画属性开始的值。如果没有指定,动画开始通过属性的get方法获得值。颜色用6个十六进制数表示,如#333333。android:duration 动画的时间,默认是 300 milliseconds。android:startOffset 开始 start()调用后,动画的阻塞时间。android:repeatCount 动画重复的次数。设置为 -1 代表无限循环 0 代表不重复(默认)正数 代表次数android:repeatMode 动画重复的模式。当动画到达动画末端时,动画的行为。 android:repeatCount 必须被设置为正数或 -1 才会有效果(影响)。设置为"reverse",每次迭代会反转动画的方向;设置为"repeat每次开始时,动画会有一个循环。android:valueType 如果值是一个颜色,不要指定该值。动画框架会自动处理颜色值。值:intType 值:floatType (default)

<animator> 基于一定时间执行的一个动画,代表了一个ValueAnimator。
属性:(同上)
例子:XML file saved at res/animator/property_animator.xml:

<set android:ordering="sequentially">    <set>        <objectAnimator            android:propertyName="x"            android:duration="500"            android:valueTo="400"            android:valueType="intType"/>        <objectAnimator            android:propertyName="y"            android:duration="500"            android:valueTo="300"            android:valueType="intType"/>    </set>    <objectAnimator        android:propertyName="alpha"        android:duration="500"        android:valueTo="1f"/></set>

使用方式:
1. 使用加载器 加载XML资源到 AnimatorSet对象中
2. 开始动画前,为所有的动画注册目标对象
3. 启动动画

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,    R.anim.property_animator);set.setTarget(myObject);set.start();

2 视图动画 View Animation

视图动画框架既支持补间动画又支持帧动画,两者都能在XML中定义。下面描述怎么使用两种方法:

2.1 补间动画

文件位置:res/anim/filename.xml
文件名会被用作资源ID
编译资源文件数据类型:Animation

资源引用:
java中: R.anim.filename
语法:

<?xml version="1.0" encoding="utf-8"?><set xmlns:android="http://schemas.android.com/apk/res/android"    android:interpolator="@[package:]anim/interpolator_resource"     interpolation插入    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>

<set>: 一个容器,支持其他的动画元素,(<alpha>, <scale>, <translate>, <rotate>或其他<set>元素) 代表 AnimationSet。
属性:
android:interpolator 插入者,应用动画的插入者,该值必须是一个指向某个插入者(不是一个插入者的类名)资源的引用。
android:shareInterpolator 如果你想和子元素共享相同的插入者,就为true ;
<alpha>: 褪色动画,代表 AlphaAnimation
android:fromAlpha 0.0 - 1.0
android:toAlpha

<scale>: 重设大小的动画
android:fromXScale 设置为1.0 不改变
android:toXScale
android:fromYScale
android:toYScale
android:pivotX
android:pivotY

<translate>: 一个垂直或水平方向的移动 有下面3种格式的属性值:
-100% — 100% 说明相对于它自身的百分比
-100%p —100%p 说明相当于它父容器的百分比
没有前缀的浮点数,说明是绝对值
属性:

android:fromXDeltaandroid:toXDeltaandroid:fromYDeltaandroid:toYDelta

一个轮转或旋转动画
属性:

android:fromDegreesandroid:toDegreesandroid:pivotXandroid:pivotY

例子:

<set xmlns: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);

Interpolators (插入者) Interpolators 是 XML 中定义的一个动画修饰符,影响一个动画改变的频率。它允许存在的动画,加速。减速,重复,和退回(反弹,颠簸)等。一个插入者通过android:interpolator属性应用到动画元素,它的值是一个 interpolator 资源的引用。

在android中,所有可用的interpolator都是Interpolator 类的子类。对于每个Interpolator 类来说,android包括一些你可引用的公共资源,以至于你可以通过android:interpolator属性应用Interpolator到动画中。下面的表给出了一些可用的资源:

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

下面是如何引用这些资源的方法:

<set android:interpolator="@android:anim/accelerate_interpolator">    ...</set>

2.2 自定义interpolator

如果你对平台提供的interpolator不满意,你可以创建自定义的interpolator资源。例如,AnticipateInterpolator调整加速的速度,或者调整 CycleInterpolator的次数。为了做到这些,你需要在XML文件中创建你自己的Interpolator。

文件的位置:
res/anim/filename.xml
文件名被用作资源ID

编译的资源的数据类型:
一个Interpolator对象

资源的引用方式:
在XML中:@[package:]anim/filename

语法:

<?xml version="1.0" encoding="utf-8"?><InterpolatorName xmlns:android="http://schemas.android.com/apk/res/android"    android:attribute_name="value"/>

如果你不使用任何属性,那么你的Interpolator和平台提供的一样。

元素:<accelerateDecelerateInterpolator>开始和结束速率较慢,但中间的时候快,该标签没有属性。<accelerateInterpolator> 开始的时候慢,然后加速,标签属性:android:factor Float类型,加速的速率。默认值为1。<anticipateInterpolator>变化开始向后,然后向前。标签属性:android:tension Float类型 tension 张力大小 。默认值为2。<anticipateOvershootInterpolator>变化开始向后,向前,然后冲到目标值,然后设置到最终值。属性值:android:tension  tension 张力大小 。默认值为2    android:extraTension  张力值  默认值为1.5。<bounceInterpolator>变化是在末尾回退。没有属性。<cycleInterpolator>     重复动画的次数,变化率遵循sinusoidal 模式。 标签属性:   android:cycles Integer循环的次数。默认值为1。<decelerateInterpolator> 开始变化很快,然后减速。 属性:android:factor  默认值为1。<linearInterpolator>变化率是常量。没有属性。<overshootInterpolator>向前变化,冲到最后值,然后返回。属性: android:tension  Float.  默认值为2。

例子:
文件保存在res/anim/my_overshoot_interpolator.xml

<?xml version="1.0" encoding="utf-8"?><overshootInterpolator xmlns:android="http://schemas.android.com/apk/res/android"    android:tension="7.0"/>

在动画XML中应用 interpolator:

<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" />

2.3 帧动画 Frame Animation

使用XML定义的一种动画,按序展示一组图片(就像电影)。
文件位置:
res/drawable/filename.xml 文件名会作为资源ID
编译的资源数据类型:
AnimationDrawable

资源引用方式:
java中:R.drawable.filename
XML中:@[package:]drawable.filename

语法:

<?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>
元素:<animation-list>该标签必须有。它是根元素,包含一个或多个<item>元素属性:android:oneshot     Boolean 如果为true只执行动画1次;false,循环动画。<item>动画的一帧,必须是<animation-list>元素的子元素。属性:android:drawable 图像资源,图像用来作为每一帧android:duration Integer 展示该帧的时间,以milliseconds计。

例子:
文件保存在:res/anim/rocket.xml

<?xml version="1.0" encoding="utf-8"?><animation-list xmlns:android="http://schemas.android.com/apk/res/android"    android:oneshot="false">    <item android:drawable="@drawable/rocket_thrust1" android:duration="200" />    <item android:drawable="@drawable/rocket_thrust2" android:duration="200" />    <item android:drawable="@drawable/rocket_thrust3" android:duration="200" /></animation-list>

应用代码,设置动画为一个View的背景,然后开始播放动画。

ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);rocketImage.setBackgroundResource(R.drawable.rocket_thrust);rocketAnimation = (AnimationDrawable) rocketImage.getBackground();rocketAnimation.start();    

具体例子请看:https://github.com/Luise-li

0 0
原创粉丝点击