基于投掷的动画使用与对象速度成正比的摩擦力。使用它可为对象的属性添加动画效果,并逐渐结束动画。它具有初始动量(主要来自手势速度),并逐渐减速。当动画的速度足够低,以至于在设备屏幕上没有明显变化时,动画就会结束。
如需了解相关主题,请阅读以下指南:
添加 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);
设置速度
起始速度定义了动画属性在动画开始时的变化速度。默认初始速度设置为每秒 0 像素。因此,您必须定义一个起始速度,以确保动画不会立即结束。
您可以使用固定值作为初始速度,也可以根据轻触手势的速度来确定初始速度。如果您选择提供固定值,则应以每秒 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 像素。