使用弹跳动画移动视图

尝试 Compose 方法
Jetpack Compose 是 Android 推荐的 UI 工具包。了解如何在 Compose 中使用动画。

基于弹跳的动画使用与物体速度成正比的摩擦力。使用它来为物体的属性设置动画,并逐渐结束动画。它具有初始动量,该动量主要来自手势速度,并逐渐减慢。当动画的速度低到足以在设备屏幕上没有可见变化时,动画就会结束。

图 1. 弹跳动画

要了解相关主题,请阅读以下指南

添加 AndroidX 库

要使用基于物理的动画,您必须将 AndroidX 库添加到您的项目中,如下所示

  1. 打开您应用模块的 build.gradle 文件。
  2. 将 AndroidX 库添加到 dependencies 部分。

    Groovy

            dependencies {
                implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0'
            }
            

    Kotlin

            dependencies {
                implementation("androidx.dynamicanimation:dynamicanimation:1.0.0")
            }
            

创建弹跳动画

The FlingAnimation 类允许您为对象创建弹跳动画。要构建弹跳动画,请创建 FlingAnimation 类的实例,并提供一个对象和要设置动画的该对象的属性。

Kotlin

val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)

Java

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

设置速度

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

您可以使用固定值作为起始速度,也可以将其基于触摸手势的速度。如果您选择提供固定值,则应以每秒 dp 为单位定义该值,然后将其转换为每秒像素。以每秒 dp 为单位定义该值可以使速度独立于设备的密度和外形尺寸。有关将起始速度转换为每秒像素的更多信息,请参阅 在弹簧动画中将每秒 dp 转换为每秒像素 部分。

要设置速度,请调用 setStartVelocity() 方法并以每秒像素为单位传递速度。该方法将返回设置了速度的弹跳对象。

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

设置动画值范围

当您想要将属性值限制在某个范围内时,可以在设置动画时设置最小和最大动画值。当您为具有固有范围的属性设置动画时,此范围控制特别有用,例如 alpha(从 0 到 1)。

注意:当弹跳动画的值达到最小值或最大值时,动画就会结束。

要设置最小值和最大值,请分别调用 setMinValue()setMaxValue() 方法。这两个方法都将返回您为其设置值的动画对象。

设置摩擦力

The setFriction() 方法允许您更改动画的摩擦力。它定义了动画中速度下降的速度。

注意:如果您在动画开始时没有设置摩擦力,动画将使用默认摩擦力值 1。

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

示例代码

下面的示例说明了一个水平弹跳。从速度跟踪器捕获的速度是 velocityX,滚动范围设置为 0 和 maxScroll。摩擦力设置为 1.1。

Kotlin

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

Java

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() 方法并传递最小可见常量之一或您需要为自定义属性计算的值。有关计算此值的更多信息,请参阅 计算最小可见变化值 部分。

Kotlin

anim.minimumVisibleChange = DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE

Java

anim.setMinimumVisibleChange(DynamicAnimation.MIN_VISIBLE_CHANGE_SCALE);

注意:您只需要在为未以像素定义的自定义属性设置动画时传递值。

计算最小可见变化值

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

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

例如,您要为其设置动画的属性从 0 进度到 100。这对应于 200 像素的变化。根据公式,最小可见变化值是 100 / 200 等于 0.5 像素。