API Guides (Anroid 7.1.1) Property Animation——属性动画

来源:互联网 发布:输入网络凭据 编辑:程序博客网 时间:2024/06/17 13:01


Develop > API Guids > Animation and Graphics

 

Property Animation

属性动画系统是一个强大的框架,允许对几乎任何东西进行动画处理。您可以定义动画来随时间更改任何对象属性,而不管它是否绘制到屏幕。属性动画在指定的时间长度内更改属性(对象中的字段)值。要为某个对象添加动画,请指定要动画化的对象属性,例如对象在屏幕上的位置,要为其设置动画的时间长度,以及要在其间动画的值。

 

属性动画系统允许您定义动画的以下特征:

持续时间:您可以指定动画的持续时间。默认长度为300 ms

时间插值:您可以指定属性的值如何作为动画的当前耗用时间的函数计算。

重复计数和行为:您可以指定是否在到达持续时间结束时重复动画,以及重复动画的次数。您还可以指定是否要反转播放动画。将其设置为逆向播放动画,然后向后重复播放动画,直到达到重复次数。

动画集:您可以将动画分组为一起播放或顺序播放或在指定延迟后播放的逻辑集。

帧刷新延迟:您可以指定刷新动画帧的频率。默认设置为每10毫秒刷新一次,但应用程序可以刷新帧的速度最终取决于系统整体的忙碌程度以及系统如何快速为底层定时器提供服务。

 

属性动画如何工作

首先,让我们通过一个简单的例子来了解动画的工作原理。图1描绘了使用其x属性进行动画化的假设对象,x表示其在屏幕上的水平位置。动画的持续时间设置为40 ms,行进距离为40像素。每10毫秒(默认帧刷新率),对象水平移动10像素。在40ms结束时,动画停止,对象在水平位置40处结束。这是具有线性插值的动画的示例,意味着对象以恒定速度移动。

 

 

1.线性动画的示例

 

您还可以指定动画以使其具有非线性插值。图2示出了在动画开始时加速的假想对象,并且在动画结束时减速。对象在40毫秒内仍然移动40个像素,但是非线性。开始时,此动画加速到中间点,然后从中间点减速直到动画结束。如图2所示,在动画的开始和结束处行进的距离小于中间。

 

 

2.非线性动画的示例

 

让我们详细看看属性动画系统的重要组件如何计算如上所示的动画。图3描述了主类如何彼此工作。

 

 

3.如何计算动画

 

ValueAnimator对象跟踪您的动画的时间,例如动画已经运行了多长时间,以及它是动画的属性的当前值。

 

ValueAnimator封装了一个TimeInterpolator,它定义了动画插值,以及一个TypeEvaluator,它定义了如何计算动态属性的值。例如,在图2中,使用的TimeInterpolator将是AccelerateDecelerateInterpolatorTypeEvaluator将是IntEvaluator

 

要启动动画,请创建一个ValueAnimator,并为其设置要进行动画处理的属性的起始值和结束值,以及动画的持续时间。当你调用start()动画开始。在整个动画期间,ValueAnimator根据动画的持续时间和已经过去的时间,计算01之间的已过分数。已过分数表示动画完成的时间百分比,0表示0%,1表示100%。例如,在图1中,在t = 10ms时的经过分数将是0.25,因为总持续时间是t = 40ms

 

ValueAnimator完成计算已经过的分数时,它调用当前设置的TimeInterpolator来计算内插分数。内插分数将经过分数映射到考虑所设置的时间内插的新分数。例如,在图2中,由于动画缓慢加速,所以内插分数(约.15)小于在t = 10ms时所经过的分数(.25)。在图1中,内插分数总是与经过分数相同。

 

当计算插值分数时,ValueAnimator调用相应的TypeEvaluator,根据动画的插值分数,起始值和结束值计算您正在进行动画的属性的值。例如,在图2中,内插分数在t = 10ms时为.15,因此此时的属性值为.15 X40 - 0)或6

 

API Demos示例项目中的com.example.android.apis.animation包提供了许多关于如何使用属性动画系统的示例

 

属性动画和视图动画的区别

视图动画系统提供了只对View对象进行动画处理的功能,因此,如果您想对非View对象进行动画处理,则必须实现自己的代码。视图动画系统也受到约束,因为它仅仅将View对象的几个方面暴露给动画,例如视图的缩放和旋转,而不是背景颜色。

 

视图动画系统的另一个缺点是它只是在绘制视图时修改,而不是实际的View本身。例如,如果使用动画让一个按钮在屏幕上移动,该按钮绘制正确,但是你可以点击按钮的实际位置不会改变,所以你必须实现自己的逻辑来处理这个。

 

使用属性动画系统,这些约束被完全删除,您可以对任意对象(视图和非视图)的任意属性进行动画化处理,对象本身实际上被修改。属性动画系统在执行动画的方式上也更加棒。在高级别,您为动画效果分配动画效果,如颜色,位置或大小,并可以定义动画的更多方面,如插值和多个动画的同步。

 

然而,视图动画系统需要较少的时间来设置,并且需要较少的代码写入。如果视图动画完成了你需要做的一切,或者如果你现有的代码已经按你想要的方式工作,那么就不需要使用属性动画系统。如果用例出现,也可以使用两种动画系统来处理不同的情况。

 

API概述

你可以在android.animation中找到大多数属性动画系统的API。 因为视图动画系统已经在android.view.animation中定义了许多插值器,所以也可以在属性动画系统中使用这些插值器。 下表描述了属性动画系统的主要组件。

 

Animator类提供了创建动画的基本结构。通常不直接使用此类,因为它只提供必须扩展以完全支持动画值的最小功能。 以下子类扩展Animator

 

ValueAnimator

属性动画的主要计时引擎,它还计算要动画化的属性的值。它具有计算动画值并包含每个动画的时间细节的所有核心功能,关于动画是否重复的信息,接收更新事件的侦听器以及设置要评估的自定义类型的能力。动画属性有两个部分:计算动画值,并在要动画的对象和属性上设置这些值。 ValueAnimator不执行第二部分,因此您必须监听由ValueAnimator计算的值的更新,并修改要使用自己的逻辑进行动画处理的对象。有关详细信息,请参阅有关使用ValueAnimator进行动画的部分。

 

ObjectAnimator

ValueAnimator的子类,允许您将目标对象和对象属性设置为动画。此类在为动画计算新值时相应地更新属性。你想在大多数时候使用ObjectAnimator,因为它使得对目标对象的动画化过程更容易。但是,您有时需要直接使用ValueAnimator,因为ObjectAnimator还有其他一些限制,例如需要在目标对象上存在特定的方法。

 

AnimatorSet

提供将动画分组在一起的机制,以便它们彼此相关运行。您可以将动画设置为一起播放,顺序播放或在指定的延迟后播放。有关详细信息,请参阅有关使用Animator Sets编排多个动画的部分。

 

 

评估者(Evaluators)告诉属性动画系统如何计算给定属性的值。它们获取由Animator类提供的时间数据,动画的开始和结束值,并基于此数据计算属性的动画值。 属性动画系统提供以下评估器:

 

IntEvaluator

默认为int属性求值程序计算值。

 

FloatEvaluator

默认为float属性求值程序计算值。

 

ArgbEvaluator

默认为十六进制的color属性求值程序计算值。

 

TypeEvaluator

允许您创建自己的求值程序的接口。如果要对不是intfloatcolor的对象属性进行动画处理,则必须实现TypeEvaluator接口以指定如何计算对象属性的动画值。 如果要处理与默认行为不同的类型,也可以为intfloatcolor值指定自定义TypeEvaluator。 有关如何编写自定义求值程序的更多信息,请参阅有关使用TypeEvaluator的部分。

 

Interpolator时间插值器定义动画中的具体值如何作为时间的函数计算。例如,您可以指定动画在整个动画中线性发生,这意味着动画在整个时间内均匀移动,或者您可以指定动画以使用非线性时间,例如,在开始时加速,在结束时减速动画。 3描述了android.view.animation中包含的内插器。 如果所提供的插值器都不适合您的需要,请实现TimeInterpolator接口并创建自己的插件。 有关如何编写自定义插值器的更多信息,请参阅使用插值器。

 

AccelerateInterpolator

加速。

DecelerateInterpolator

减速。

AccelerateDecelerateInterpolator

先加速再减速

AnticipateInterpolator

先回退一小步然后加速前进。

OvershootInterpolator

快速到达终点并超出一小步最后回到终点

AnticipateOvershootInterpolator

先回退一小步然后加速前进到达终点并超出一小步最后回到终点

BounceInterpolator

最后阶段弹球效果

CycleInterpolator

周期运动。

LinearInterpolator

匀速

TimeInterpolator

自定义插值器的接口。

 

使用ValueAnimator设置动画

ValueAnimator类允许您通过指定一组intfloatcolor值来行进动画处理,为动画的持续时间设置某种类型的值。 您可以通过调用其工厂方法之一获得一个ValueAnimatorofIntc()ofFloat()ofObject()。 例如:

 

ValueAnimator animation = ValueAnimator.ofFloat(0f, 1f);

animation.setDuration(1000);

animation.start();

 

在此代码中,当start()方法运行时,ValueAnimator开始计算动画的值(在01之间),持续时间为1000 ms

 

您还可以通过执行以下操作,将自定义类型指定为动画:

 

ValueAnimator animation = ValueAnimator.ofObject(new MyTypeEvaluator(), startPropertyValue, endPropertyValue);

animation.setDuration(1000);

animation.start();

 

在此代码中,当start()方法运行时,ValueAnimator开始计算startPropertyValueendPropertyValue之间的动画值,使用由MyTypeEvaluator提供的逻辑,持续时间为1000 ms

 

然而,先前的代码片段对对象没有实际影响,因为ValueAnimator不直接对对象或属性操作。 您最想做的事情是使用这些计算值修改要设置动画的对象。 通过在ValueAnimator中定义侦听器以在动画的生命周期期间适当地处理重要事件(例如帧更新)来实现此目的。 当实现侦听器时,您可以通过调用getAnimatedValue()获取特定帧刷新的计算值。 有关监听器的更多信息,请参阅有关动画监听器的部分 Animation Listeners.

 

使用ObjectAnimator设置动画

ObjectAnimatorValueAnimator的子类(在上一节中讨论),它结合了定时引擎和ValueAnimator的值计算以及对目标对象的命名属性进行动画处理的能力。 这使得对任何对象的动画更容易,因为您不再需要实现

ValueAnimator.AnimatorUpdateListener,因为动画属性自动更新。

 

实例化ObjectAnimator类似于ValueAnimator,但是您还可以指定对象和该对象属性的名称(作为String)以及值之间的动画:

 

ObjectAnimator anim = ObjectAnimator.ofFloat(foo, "alpha", 0f, 1f);

anim.setDuration(1000);

anim.start();

 

要使ObjectAnimator更新属性正确,必须执行以下操作:

 

·您要动画的对象属性必须具有set <propertyName>()形式的setter函数(在camel case中)。因为ObjectAnimator在动画期间自动更新属性,所以它必须能够使用此setter方法访问属性。例如,如果属性名是foo,则需要有一setFoo()方法。如果此setter方法不存在,您有三个选项:

··如果您有权执行此操作,请将setter方法添加到类中。

··使用您有权更改的包装器类,并使包装器接收具有有效setter方法的值,并将其转发到原始对象。

··请改用ValueAnimator

 

·如果您在ObjectAnimator工厂方法之一中为values ...参数仅指定一个值,则假定它是动画的结束值。因此,您要动画的对象属性必须有一个getter函数,用于获取动画的起始值。getter函数必须是get <propertyName>()的形式。例如,如果属性名是foo,则需要有一个getFoo()方法。

 

·您要动画的属性的getter(如果需要)和setter方法必须与您为ObjectAnimator指定的开始值和结束值操作相同的类型。例如,如果构造以下ObjectAnimator,则必须具有targetObject.setPropNamefloat)和targetObject.getPropNamefloat):

ObjectAnimator.ofFloattargetObject“propName”1f

 

·根据您要动画化的属性或对象,您可能需要在视图上调用invalidate()方法,以强制屏幕使用更新的动画值重绘本身。你可以在onAnimationUpdate()回调中做到这一点。例如,对Drawable对象的颜色属性进行动画处理只会在对象重绘本身时更新屏幕。View上的所有属性设置,例如setAlpha()和setTranslationX()使View无效,所以当使用新值调用这些方法时,您不需要使View无效。有关监听器的更多信息,请参阅有关动画监听器的部分

 

使用AnimatorSet编排复合动画

在许多情况下,你想播放一个动画,取决于另一个动画开始或结束的时间 Android系统允许您将动画绑定到AnimatorSet中,以便您可以指定是同时顺序启动动画还是在指定的延迟后启动动画。您还可以将AnimatorSet对象嵌套在彼此之内。

 

从弹跳球Bouncing Balls样本(为简单起见进行修改)中取得的以下示例代码以下列方式播放以下Animator对象:

1.播放bounceAnim

2.同时播放squashAnim1squashAnim2stretchAnim1stretchAnim2

3.播放bounceBackAnim

4.播放fadeAnim

AnimatorSet bouncer = new AnimatorSet();

bouncer.play(bounceAnim).before(squashAnim1);

bouncer.play(squashAnim1).with(squashAnim2);

bouncer.play(squashAnim1).with(stretchAnim1);

bouncer.play(squashAnim1).with(stretchAnim2);

bouncer.play(bounceBackAnim).after(stretchAnim2);

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);

fadeAnim.setDuration(250);

AnimatorSet animatorSet = new AnimatorSet();

animatorSet.play(bouncer).before(fadeAnim);

animatorSet.start();

有关如何使用动画设置的更完整的示例,请参阅APIDemos中的Bouncing Balls示例。

 

动画监听器

您可以在动画持续时间期间使用下面描述的侦听器侦听重要事件。

·Animator.AnimatorListener

·onAnimationStart()当动画开始时调用。

·onAnimationEnd()当动画结束时调用。

·onAnimationRepeat()当动画重复时调用。

·onAnimationCancel()当动画取消时调用。取消的动画也调用onAnimationEnd(),不管它们是如何结束的。

·ValueAnimator.AnimatorUpdateListener

·onAnimationUpdate()在动画的每个帧上调用。监听此事件以使用动画期间ValueAnimator生成的计算值。要使用该值,请查询传递到事件的ValueAnimator对象,以使用getAnimatedValue()方法获取当前的动画值。如果使用ValueAnimator,则需要实现此侦听器。

根据您要动画化的属性或对象,您可能需要在视图上调用invalidate(),以强制屏幕的该区域使用新的动画值重绘本身。例如,对Drawable对象的颜色属性进行动画处理只会在对象重绘本身时更新屏幕。View上的所有属性设置,例如setAlpha()setTranslationX()使View无效,所以当使用新值调用这些方法时,您不需要使View无效。

 

如果不想实现Animator.AnimatorListener接口的所有方法,您可以扩展AnimatorListenerAdapter类,而不是实现

Animator.AnimatorListener接口。AnimatorListenerAdapter类提供了可以选择覆盖的方法的空实现。

 

例如,API演示中的Bouncing Balls示例为onAnimationEnd()回调创建了AnimatorListenerAdapter

 

ValueAnimator fadeAnim = ObjectAnimator.ofFloat(newBall, "alpha", 1f, 0f);

fadeAnim.setDuration(250);

fadeAnim.addListener(newAnimatorListenerAdapter() {

public voidonAnimationEnd(Animator animation) {

    balls.remove(((ObjectAnimator)animation).getTarget());

}

 

动画对ViewGroup的布局更改

属性动画系统提供了对ViewGroup对象进行动画更改的功能,以及提供一种简单的方法来动画化View对象本身。

 

您可以使用LayoutTransition类在一个ViewGroup中动画化布局更改。 当您在ViewGroup中添加或删除动画时,ViewGroup中的视图可以通过出现和消失的动画,或者当您使用VISIBLEandroid.view.ViewINVISIBLE}GONE调用ViewsetVisibility()方法时, 当您添加或删除视图时,ViewGroup中的其余视图还可以动画到其新位置。 您可以通过调用setAnimator()并传递具有以下LayoutTransition常量之一的Animator对象,在LayoutTransition对象中定义以下动画:

·APPEARING指示在容器中显示的项目上运行的动画的标志。

·CHANGE_APPEARING指示在由于容器中出现新项目而更改的项目上运行的动画的标志。

·DISAPPEARING指示在从容器中消失的项目上运行的动画的标志。

·CHANGE_DISAPPEARING 指示在由于项目从容器中消失而更改的项目上运行的动画的标志。

 

您可以为这四种类型的事件定义自己的自定义动画,以自定义布局过渡的外观,或者只是告诉动画系统使用默认动画。

 

API演示中的LayoutAnimations示例显示了如何定义布局转换的动画,然后在要进行动画处理的View对象上设置动画。

 

LayoutAnimationsByDefault及其相应的layout_animations_by_default.xml布局资源文件显示了如何在XML中为

ViewGroups启用默认布局转换。 你唯一需要做的是为ViewGroup设置androidanimateLayoutchanges属性为true。 例如:

<LinearLayout

    android:orientation="vertical"

    android:layout_width="wrap_content"

    android:layout_height="match_parent"

    android:id="@+id/verticalContainer"

    android:animateLayoutChanges="true" />

将此属性设置为true会自动将从ViewGroup中添加或删除的视图以及ViewGroup中的其余视图。

 

使用TypeEvaluator

如果要对Android系统未知的类型进行动画处理,可以通过实现TypeEvaluator接口创建自己的求值程序。Android系统已知的类型是intfloatcolor,它们由IntEvaluatorFloatEvaluatorArgbEvaluator类型评估程序支持。

 

TypeEvaluator接口中只有一种方法,即evaluate()方法。 这允许您使用的动画制作器在动画的当前点为动画属性返回适当的值。FloatEvaluator类演示如何做到这一点:

public class FloatEvaluator implements TypeEvaluator {

 

    public Object evaluate(float fraction, Object startValue, Object endValue) {

        float startFloat = ((Number) startValue).floatValue();

        return startFloat + fraction * (((Number) endValue).floatValue() - startFloat);

    }

}

 

注意:当ValueAnimator(或ObjectAnimator)运行时,它计算动画的当前已过部分(01之间的值),然后根据您使用的内插器计算内插版本。 内插分数是你的TypeEvaluator通过fraction参数接收的,所以你不必在计算动画值时考虑内插器

 

使用Interpolators

内插器定义动画中的具体值如何作为时间的函数计算。例如,您可以指定动画在整个动画中线性发生,这意味着动画在整个时间内均匀移动,或者您可以指定动画以使用非线性时间,例如,使用在开始或结束时的加速或减速动画。

 

动画系统中的内插器接收来自动画制作者的分数,其代表动画的经过时间。插值器修改这个分数以与它想要提供的动画的类型一致。 Android系统在android.view.animation包中提供了一组常见的内插器。如果这些都不符合你的需要,你可以实现TimeInterpolator接口并创建自己的。

 

例如,下面比较默认插值器AccelerateDecelerateInterpolatorLinearInterpolator如何计算插值分数。LinearInterpolator对已过分数没有影响。AccelerateDecelerateInterpolator加速到动画并减速。以下方法定义了这些内插器的逻辑:

AccelerateDecelerateInterpolator

public float getInterpolation(float input) {

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

}

LinearInterpolator

public float getInterpolation(float input) {

    return input;

}

下表表示由这些内插器为持续1000ms的动画计算的近似值

ms elapsed

Elapsed fraction/Interpolated fraction (Linear)

Interpolated fraction (Accelerate/Decelerate)

0

0

0

200

0.2

0.1

400

0.4

0.345

600

0.6

0.8

800

0.8

0.9

1000

1.0

1.0

如表所示,LinearInterpolator以相同的速度更改值,每经过200ms就会更改0.2AccelerateDecelerateInterpolator200ms600ms之间更快,在600ms1000ms之间更慢

 

指定关键帧(Specifying Keyframes)

关键帧对象由时间/值对组成,允许您在动画的特定时间定义特定状态。 每个关键帧也可以有自己的插值器,以控制动画在上一个关键帧的时间和该关键帧的时间之间的间隔中的行为。

 

要实例化一个Keyframe对象,必须使用ofInt()ofFloat()ofObject()的工厂方法之一来获得相应类型的关键帧。 然后调用ofKeyframe()工厂方法来获取PropertyValuesHolder对象。 一旦你有了对象,你可以通过传递PropertyValuesHolder对象和对象来获得animator。 以下代码段演示了如何执行此操作:

Keyframe kf0 = Keyframe.ofFloat(0f, 0f);

Keyframe kf1 = Keyframe.ofFloat(.5f, 360f);

Keyframe kf2 = Keyframe.ofFloat(1f, 0f);

PropertyValuesHolder pvhRotation = PropertyValuesHolder.ofKeyframe("rotation", kf0, kf1, kf2);

ObjectAnimator rotationAnim = ObjectAnimator.ofPropertyValuesHolder(target, pvhRotation)

rotationAnim.setDuration(5000ms);

有关如何使用关键帧的更完整示例,请参阅APIDemos中的MultiPropertyAnimation示例。

 

动画视图

属性动画系统允许View对象的流线型动画,并且提供了超过视图动画系统的一些优点。视图动画系统通过更改绘制对象的方式来转换视图对象。这是在每个View的容器中处理的,因为View本身没有可操作的属性。这导致View被动画化,但是View对象本身没有改变。这导致诸如对象仍然存在于其原始位置的行为,即使它被绘制在屏幕上的不同位置。在Android 3.0中,添加了新属性和相应的gettersetter方法以消除此缺点。

 

属性动画系统可以通过更改View对象中的实际属性来在屏幕上激活视图。此外,视图还会在其属性更改时自动调用invalidate()方法来刷新屏幕。方便属性动画的View类中的新属性是:

·translationXtranslationY这些属性控制视图位于其左侧和顶部坐标(由其布局容器设置)的增量

·rotationrotationXrotationY这些属性控制2D(旋转属性)中的旋转和绕枢轴点的3D

·scaleXscaleY这些属性控制视图绕其轴点的2D缩放

·pivotXpivotY这些属性控制枢轴点的位置,围绕该点旋转和缩放变换发生。默认情况下,枢轴点位于对象的中心。

·xy这些是简单的实用程序属性,用于在其容器中描述视图的最终位置,作为左值和顶值以及translationXtranslationY值的和。

·alpha表示视图上的alpha透明度默认情况下,此值为1(不透明),值为0表示完全透明(不可见)。

要为View对象的属性(例如其颜色或旋转值)设置动画,您只需创建一个属性动画并指定要设置动画的View属性。 例如:

ObjectAnimator.ofFloatmyView,“rotation”,0f360f;

有关创建动画制作者的更多信息,请参阅有关使用ValueAnimatorObjectAnimator进行动画制作的部分。

 

使用ViewPropertyAnimator进行动画处理

ViewPropertyAnimator提供了一种简单的方法来使用单个底层Animator对象来并行地对视图的多个属性进行动画。 它的行为非常像一个ObjectAnimator,因为它修改视图的属性的实际值,但是当同时动画许多属性更有效。 此外,使用ViewPropertyAnimator的代码更简洁,更容易阅读。 以下代码片段显示了在同时对视图的xy属性进行动画处理时,在使用多个ObjectAnimator对象,单个ObjectAnimatorViewPropertyAnimator时的差异。

多个ObjectAnimator对象

ObjectAnimator animX = ObjectAnimator.ofFloat(myView, "x", 50f);

ObjectAnimator animY = ObjectAnimator.ofFloat(myView, "y", 100f);

AnimatorSet animSetXY = new AnimatorSet();

animSetXY.playTogether(animX, animY);

animSetXY.start();

单个ObjectAnimator

PropertyValuesHolder pvhX = PropertyValuesHolder.ofFloat("x", 50f);

PropertyValuesHolder pvhY = PropertyValuesHolder.ofFloat("y", 100f);

ObjectAnimator.ofPropertyValuesHolder(myView, pvhX, pvyY).start();

ViewPropertyAnimator

myView.animate().x(50f).y(100f);

有关ViewPropertyAnimator的更多详细信息,请参阅相应的Android开发人员博客帖子


在XML中声明动画

属性动画系统允许您使用XML声明属性动画,而不是以编程方式。 通过使用XML定义动画,您可以轻松地在多个活动中重复使用动画,并更轻松地编辑动画序列。

 

要将使用新属性动画API的动画文件与使用旧视图动画框架的动画文件区分开来,从Android 3.1开始,您应该将属性动画的XML文件保存在res / animator /目录中。

 

以下属性动画类通过以下XML标记支持XML声明:

·ValueAnimator<animator>

·ObjectAnimator<objectAnimator>

·AnimatorSet<set>

以下示例顺序播放两组对象动画,第一个嵌套集合一起播放两个对象动画:

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

为了运行此动画,您必须将代码中的XML资源扩充为AnimatorSet对象,然后在开始动画集之前为所有动画设置目标对象。 为方便起见,调用setTarget()AnimatorSet的所有子项设置单个目标对象。 以下代码显示了如何执行此操作:

AnimatorSet set = (AnimatorSet) AnimatorInflater.loadAnimator(myContext,

    R.anim.property_animator);

set.setTarget(myObject);

set.start();

有关定义属性动画的XML语法的信息,请参阅动画资源。Animation Resources

0 0
原创粉丝点击