第三部分:Android 应用程序接口指南---第四节:动画和图形---第二章 View动画与Drawable动画

时间:2022-09-10 16:36:40

第2章 View动画与Drawable动画

2.1 View动画

你可以使用View的动画系统,在View上执行的补间动画。补间动画进行,如起点,终点,大小,旋转,动画的其他普通法方面的计算。补间动画可以执行一系列简单的View对象的内容转换(位置,大小,旋转,透明度)。所以,如果你有一个TextView的对象,你可以移动,旋转,放大,或缩小文本。如果它有一个背景图片,背景图片将随着文字变形。animation这个包(package)中提供了所有用于补间动画类。定义补间动画所指定的序列可以通过XML或Android代码来定义。推荐使用XML文件来定义一个布局,因为它更具可读性,可重复使用,易修改。在下面的例子中,我们使用XML来定义动画。动画可以指定你想要发生的时间,持续时间,连续或同时播放等。例如,你有一个TextView从左至右移动,然后旋转180度,或者你有一个TextView从左至右移动,并同时旋转。

动画的XML文件定义在res/anim/文件夹下。该文件必须有一个根元素:<set>

从下面的XML的ApiDemos之一它是用于拉伸,然后同时缩放和旋转视图对象。如代码清单1-1所示:

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

        <scale

           android:fromXScale="1.4"

           android:toXScale="0.0"

           android:fromYScale="0.6"

           android:toYScale="0.0"

           android:pivotX="50%"

           android:pivotY="50%"

           android:startOffset="700"

           android:duration="400"

           android:fillBefore="false" />

        <rotate

           android:fromDegrees="0"

           android:toDegrees="-45"

           android:toYScale="0.0"

           android:pivotX="50%"

           android:pivotY="50%"

           android:startOffset="700"

           android:duration="400" />

    </set>

</set>

 

代码清单1-1

屏幕坐标(在这个例子中不使用)(0,0)在左上角,并增加向下和右侧。

一些值,如pivotX,可以指定对象本身或相对于父控件。你想要的东西一定要使用正确的格式(“50”为50%是有区别的, 50%表示相对对象本身)。

你可以决定如何随着时间的推移应用分配一个加速器(Interpolator)。Android包括几个加速器子类指定不同的速度曲线:例如,AccelerateInterpolator的讲述一个开始减缓和加快转型。每个人都有一个属性值,可以在XML应用。此XML保存在项目res/anim/目录下的hyperspace_jump.xml,下面的代码将引用它,并将其应用于从布局到ImageView的对象。如代码清单1-2所示:

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);

Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);

spaceshipImage.startAnimation(hyperspaceJumpAnimation);

 

代码清单1-2

2.2 Drawable动画

Drawable动画你可以理解为是帧动画,一般业内我们也叫它帧动画。它让你加载一个系列drawable资源来创建一个动画。就像翻书一样。AnimationDrawable类是帧动画的基础。其实帧动画使用起来很简单。你可以在XML文件中定义你想要的动画序列。如按照下面的格式即可,参考下面代码清单1-3所示:

<animation-list xmlns:android="http://schemas.android.com/apk/res/android"

    android:oneshot="true">

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

代码清单1-3

这个帧动画只有三帧。并且设置了oneshot=“true”,表示只执行一次,然后会停在最后一帧。当然你设置为false他就会循环运行了。一般我们放在res/anim/目录下,当然有些人也喜欢放在res/drawable/目录下,这都是可以的。这个XML文件会被当成View的background属性来播放。以下代码清单1-4就是一个例子:

AnimationDrawable rocketAnimation;

public void onCreate(Bundle savedInstanceState) {

  super.onCreate(savedInstanceState);

  setContentView(R.layout.main);

  ImageView rocketImage = (ImageView) findViewById(R.id.rocket_image);

  rocketImage.setBackgroundResource(R.drawable.rocket_thrust);

  rocketAnimation = (AnimationDrawable) rocketImage.getBackground();

}

public boolean onTouchEvent(MotionEvent event) {

  if (event.getAction() == MotionEvent.ACTION_DOWN) {

    rocketAnimation.start();

    return true;

  }

  return super.onTouchEvent(event);

}

 

代码清单1-4

请注意,动画的.start()方法放在onCreate()中是无效的。如果你想要程序自动后就立即播放,你可以考虑重写onWindowFocusChanged() 方法,并把rocketAnimation.start()放在其中即可。