您可以使用视图动画系统对视图执行补间动画。补间动画 使用起点、终点、大小、旋转角度和 动画的其他常见方面。
补间动画可以执行一系列简单的转换(位置、大小、旋转
和透明度)。因此,如果您有一个 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 语法、可用标记和属性,请参阅动画资源。
注意:无论动画如何移动或调整大小, 容纳动画的视图的边界将不会自动进行调整以适应该视图。 即便如此,动画仍会被绘制到其视图边界之外,并且不会被裁剪。 但是,如果动画超出了父级视图的边界,系统将会进行剪裁。