基于抛掷的动画使用与物体速度成比例的摩擦力。用它来为物体的属性设置动画,并逐渐结束动画。它具有初始动量,主要来自手势速度,并逐渐减慢。当动画速度低到足以使设备屏幕上没有可见变化时,动画结束。
要了解相关主题,请阅读以下指南
添加 AndroidX 库
要使用基于物理的动画,您必须按如下所示将 AndroidX 库添加到您的项目中
- 打开应用模块的
build.gradle
文件。 - 将 AndroidX 库添加到
dependencies
部分。Groovy
dependencies { implementation 'androidx.dynamicanimation:dynamicanimation:1.0.0' }
Kotlin
dependencies { implementation("androidx.dynamicanimation:dynamicanimation:1.0.0") }
创建抛掷动画
FlingAnimation
类允许您为对象创建抛掷动画。要构建抛掷动画,请创建 FlingAnimation
类的实例,并提供一个对象以及您要为其设置动画的对象属性。
Kotlin
val fling = FlingAnimation(view, DynamicAnimation.SCROLL_X)
Java
FlingAnimation fling = new FlingAnimation(view, DynamicAnimation.SCROLL_X);
设置速度
起始速度定义动画开始时动画属性变化的速度。默认起始速度设置为每秒零像素。因此,您必须定义起始速度才能确保动画不会立即结束。
您可以使用固定值作为起始速度,也可以基于触摸手势的速度。如果您选择提供固定值,则应以每秒 dp 为单位定义该值,然后将其转换为每秒像素。以每秒 dp 为单位定义该值允许速度独立于设备的密度和外形尺寸。有关将起始速度转换为每秒像素的更多信息,请参阅 将每秒 dp 转换为每秒像素 部分中的 弹簧动画。
要设置速度,请调用 setStartVelocity()
方法并以每秒像素为单位传递速度。该方法返回设置了速度的抛掷对象。
注意:使用 GestureDetector.OnGestureListener
和 VelocityTracker
类分别检索和计算触摸手势的速度。
设置动画值范围
当您想要将属性值限制在特定范围内时,您可以设置最小和最大动画值。当您为具有内在范围的属性(例如 alpha(从 0 到 1))设置动画时,此范围控制特别有用。
注意:当抛掷动画的值达到最小值或最大值时,动画结束。
要设置最小值和最大值,请分别调用 setMinValue()
和 setMaxValue()
方法。这两种方法都会返回您已为其设置值的动画对象。
设置摩擦力
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_X
、TRANSLATION_Y
、TRANSLATION_Z
、SCROLL_X
和SCROLL_Y
等视图属性,默认最小可见变化值为 1 像素。 - 对于使用旋转的动画,例如
ROTATION
、ROTATION_X
和ROTATION_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 像素。