使用投掷动画移动视图

试试 Compose 方式
Jetpack Compose 是推荐在 Android 设备上使用的界面工具包。了解如何在 Compose 中使用动画。

投掷动画使用与物体成比例的摩擦力, 对象的速度。您可以使用该动画为某个对象的某个属性添加动画效果,还可以使用该动画逐渐结束动画。它的初始动量是 大部分用户来自手势速度,然后会逐渐变慢。当动画速度足够低,在设备屏幕上没有任何可见变化时,动画便会结束。

图 1. 投掷动画

如需了解相关主题,请参阅以下指南:

添加 AndroidX 库

如需使用基于物理特性的动画,您必须按如下所述将 AndroidX 库添加到项目中:

  1. 打开应用模块的 build.gradle 文件。
  2. 将 AndroidX 库添加到 dependencies 部分。
            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            
            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

创建投掷动画

借助 FlingAnimation 类,您可以创建 对象的快速滑动动画。如需创建投掷动画,请创建 FlingAnimation 类的实例,并提供一个对象及该对象要添加动画效果的属性。

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);

设置速度

起始速度定义了动画属性在动画一开始发生变化时的速度。默认起始速度为 设成每秒 0 个像素因此,您必须定义起始速度 以确保动画不会立即结束。

您可以使用固定值作为起始速度,也可以以固定值为基准 触摸手势的速度如果您选择提供固定值,则应定义以“dp/秒”为单位的值,然后将其转换为以“像素/秒”为单位。以“dp/秒”为单位定义值 而不受设备的密度和外形规格的限制如需详细了解 将起始速度转换为“像素/秒”,请参阅 正在转换 “dp/秒”转换为“像素/秒”部分 弹簧动画

如需设置速度,请调用 setStartVelocity() 方法并传递以“像素/秒”为单位的速度。该方法会在 用于指明速度

注意:使用 GestureDetector.OnGestureListenerVelocityTracker 类可分别检索和计算轻触手势的速度。

设置动画值的范围

您可以根据需要设置动画的最小值和最大值 将属性值限制在特定范围内。当您为具有内在范围的属性(如 Alpha 透明度的范围为 0 到 1)添加动画效果时,这种范围控制尤其有用。

注意:当投掷动画的值达到 最小值或最大值,则动画结束。

如需设置最小值和最大值,请调用 setMinValue()setMaxValue() 方法。 这两种方法均返回您为其设置值的动画对象。

设置摩擦力

借助 setFriction() 方法,您可以更改动画的 该方法定义了动画速度的降低速度。

注意:如果您在刚开始时没有设置障碍 动画,则动画使用默认摩擦值为 1。

该方法返回的对象的动画会使用您提供的摩擦力值。

示例代码

以下示例展示了水平投掷。速度跟踪器捕获的速度为 velocityX,且滚动边界值设置为 0 和 maxScroll。摩擦力设置为 1.1。

FlingAnimation(view, DynamicAnimation.SCROLL_X).apply {
    setStartVelocity(-velocityX)
    setMinValue(0f)
    setMaxValue(maxScroll)
    friction = 1.1f
    start()
}
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
fling.setStartVelocity(-velocityX)
        .setMinValue(0)
        .setMaxValue(maxScroll)
        .setFriction(1.1f)
        .start();

设置最小可见变化值

为未以像素为单位定义的自定义属性添加动画效果时,应设置对用户可见的动画值的最小变化值。它 确定结束动画的合理阈值。

添加动画效果时无需调用此方法 DynamicAnimation.ViewProperty,因为 最低可见变化值源自该属性。例如:

  • 对于 TRANSLATION_XTRANSLATION_YTRANSLATION_ZSCROLL_XSCROLL_Y 等视图属性,最小可见变化值默认为 1 像素。
  • 对于使用旋转(例如 ROTATIONROTATION_XROTATION_Y)的动画,最小可见变化值为 MIN_VISIBLE_CHANGE_ROTATION_DEGREES 或 1/10 像素。
  • 对于使用不透明度的动画,最小可见变化为 MIN_VISIBLE_CHANGE_ALPHA 或 1/256。

如需设置动画的最小可见变化值,请调用 setMinimumVisibleChange() 方法,并传递最小可见常量之一或针对自定义属性进行计算所需的值。如需详细了解如何计算此值,请参阅计算最小可见变化值部分。

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE
anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

注意:您只需在为未以像素为单位定义的自定义属性添加动画效果时传递值。

计算最小可见变化值

如需计算自定义属性的最小可见变化值,请使用以下公式:

最小可见变化值 = 自定义属性值的范围 / 动画范围(以像素为单位)

例如,要添加动画效果的属性从 0 渐增到 100。这对应于 200 像素的变化。根据公式,最小值 为 100 / 200 等于 0.5 像素。