视图动画

您可以使用视图动画系统对视图执行补间动画。补间动画 使用起点、终点、大小、旋转角度和 动画的其他常见方面。

补间动画可以执行一系列简单的转换(位置、大小、旋转 和透明度)。因此,如果您有一个 TextView 对象,则可以移动、旋转、放大或缩小文本。如果包含 背景图片,则背景图片会与文字一起转换。animation package 提供了补间动画所用的所有类。

一系列动画指令定义补间动画,通过 XML 或 Android 代码。与定义布局一样,建议使用 XML 文件,因为它更易读, 与对动画进行硬编码相比,可以重复使用,而且可替换。在下面的示例中,我们使用了 XML。( 如需详细了解如何在应用代码(而不是 XML)中定义动画,请参阅 AnimationSet 类和其他 Animation 子类。)

动画说明定义了您希望进行的转换, 以及需要多长时间才能应用。转换可以是连续的,也可以是同时进行的 例如,您可以让 TextView 的内容从左向右移动,然后旋转 180 度,也可让文本同时移动和旋转。每个转换 该转换特有的一组参数(大小的起始大小和结束大小) 旋转的起始角度和结束角度等),还有一组常见的 参数(例如,开始时间和时长)。要进行多次转换,请执行以下操作: 为它们指定相同的开始时间;让它们按顺序排列,计算开始时间 与前一转换的时长之和。

动画 XML 文件位于 Android 设备的 res/anim/ 目录中 项目。该文件必须具有单个根元素:可以是单个 <alpha><scale><translate><rotate>、插值器元素或<set> 这些元素组(可能包括另一个 <set>)。默认情况下 同时应用动画指令。要使其按顺序发生,您必须 指定 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%)。

您可以通过分配 Interpolator 来确定如何随着时间的推移应用转换。Android 包含几个插值器子类, 指定各种速度曲线:例如 AccelerateInterpolator 指示转换缓慢开始并加快。每个元素都有一个属性值,可以是 。

将此 XML 另存为 res/anim/ 中的 hyperspace_jump.xml 目录中,以下代码将引用它并将其应用到布局中的 ImageView 对象。

Kotlin

AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump).also { hyperspaceJumpAnimation ->
    findViewById<ImageView>(R.id.spaceshipImage).startAnimation(hyperspaceJumpAnimation)
}

Java

ImageView spaceshipImage = (ImageView) findViewById(R.id.spaceshipImage);
Animation hyperspaceJumpAnimation = AnimationUtils.loadAnimation(this, R.anim.hyperspace_jump);
spaceshipImage.startAnimation(hyperspaceJumpAnimation);

除了 startAnimation(),您还可以为 使用 Animation.setStartTime() 添加动画效果,然后使用 View.setAnimation() 将动画分配给视图。

如需详细了解 XML 语法、可用标记和属性,请参阅动画资源

注意:无论动画如何移动或调整大小, 容纳动画的视图的边界将不会自动进行调整以适应该视图。 即便如此,动画仍会被绘制到其视图边界之外,并且不会被裁剪。 但是,如果动画超出了父级视图的边界,系统将会进行剪裁。