(属性动画那一篇真是受够了那个编辑器,所以到Markdown上来了)
你可以使用视图动画系统在视图上执行补间动画。Tween动画使用诸如动画的起始点,终点,大小,旋转以及其他常见方面的信息来计算动画。(编者按:Tween动画是操作某个控件让其展现出旋转、渐变、移动、缩放的这么一种转换过程,我们称为补间动画。)补间动画可以对View对象的内容执行一系列简单的转换(位置,大小,旋转和透明度)。 所以,如果你有一个TextView对象,你可以移动,旋转,增长或收缩文本。 如果它有一个背景图像,背景图像将与文本一起转换。 The animation package 提供了补间动画中使用的所有类。
一系列动画指令定义了由XML或Android代码定义的补间动画。与定义布局一样,建议使用XML文件,因为它比硬编码动画更可读,可重用和可交换。在下面的例子中,我们使用XML。(要了解更多关于在应用程序代码中定义动画,而不是XML,请参考AnimationSet类和其他Animation子类。)
动画指令定义您想要发生的转换何时发生以及应用这些动画所需的时间,转换可以是顺序的或同时的(编者按:真是没搞懂在属性动画的后面来介绍这篇,头重脚轻的感觉)。例如,您可以使TextView的内容从左到右移动,然后旋转180度,或者您可以同时移动文本并旋转。 每个变换都需要一组特定于该变换的参数(起始大小和大小变化的起始大小,起始角度和旋转结束角度等等)以及一组常用参数(例如开始时间和持续时间)。 要同时进行几次转换,给他们相同的开始时间; 使它们连续,计算开始时间加上一次变换的持续时间。
动画XML文件属于您的Android项目的res / anim /目录(编者按:这里需要你在res文件夹下面自己定义一个anim的目录,然后你建文件的时候里面会生成)。该文件必须具有单个根元素:将会是单个, , , , interpolator element,或者元素包含上面的一种或者几种(也有可能包含标签)。默认情况下,所有动画指令同时应用。 要使它们顺序发生,你必须指定startOffset属性,如下面的示例所示。
来自ApiDemos,下面的XML用于拉伸,然后同时旋转和旋转View对象。
<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>
屏幕坐标(本示例中未使用)在左上角为(0,0),并且向下和向右增加。某些值(例如pivotX)可以相对于对象本身或相对于父对象指定。 一定要使用正确的格式,你想要的(“50”为50%相对于父,或“50%”为50%相对于自己)。(编者按:这里先参照了官网的文档,但是还是不太明了,所以我再解释一下:pivotX对应的值可以是数值、百分数、百分数p 三种样式,比如 50、50%、50%p,当为数值时,表示在当前View的左上角,即原点处加上50px,做为起始缩放点;如果是50%,表示在当前控件的左上角加上自己宽度的50%做为起始点;如果是50%p,那么就是表示在当前的左上角加上父控件宽度的50%做为起始点x轴坐标。)
你可以通过分配Interpolator来确定一段时间内如何应用转换。 Android包含几个Interpolator子类,可以指定各种速度曲线:例如,AccelerateInterpolator指示转换开始慢速加速。 每个都有一个可以在XML中应用的属性值。
将此XML保存为项目的res / anim /目录中的hyperspace_jump.xml,以下代码将引用它并将其应用于布局中的ImageView对象。
ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);
作为startAnimation()的替代方法,您可以使用Animation.setStartTime()定义动画的开始时间,然后使用View.setAnimation()将动画分配给View。
有关XML语法,可用标签和属性的更多信息,请参阅Animation Resources。
注意:无论动画如何移动或调整大小,保存动画的视图的边界将不会自动调整以适应。 即使如此,动画仍将被绘制超出其视图的边界,不会被剪辑。 但是,如果动画超过父视图的边界,则会进行裁剪。
可绘制的动画可以让你一个接一个地加载一系列的Drawable资源来创建动画。 这是一种传统的动画,它的意义是创建一系列不同的图像,按顺序播放,像一卷电影。 AnimationDrawable类是可绘制动画的基础。
虽然你可以使用AnimationDrawable类API在代码中定义动画的框架,但使用单个XML文件来完成更加简单,该XML文件列出了构成动画的框架。 这种动画的XML文件属于您的Android项目的res / drawable /目录。 在这种情况下,指令是动画每帧的顺序和持续时间。
<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>
这个动画只运行三帧。 通过将列表的android:oneshot属性设置为true,它将循环一次,然后停止并保持最后一帧。如果设置为false,则动画将循环。将此XML保存为项目的res / drawable /目录中的rocket_thrust.xml(编者按:上面已经介绍过了,有兴趣的可以去翻一翻),可以将其作为背景图像添加到View,然后调用播放。 下面是一个示例,其中将动画添加到ImageView中,然后在触摸屏幕时进行动画:
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);
}
注意:在Activity的onCreate()方法中,AnimationDrawable上调用的start()方法无法调用,因为AnimationDrawable尚未完全附加到窗口。 如果要立即播放动画,而不需要交互,那么你可能希望在Activity中的onWindowFocusChanged()方法中调用它,当Android将你的窗口置于焦点时,该动画将被调用。