TranslateAnimation
<!-res/anim/move.xml --> <translate xmlns:android="http://schemas.android.com/apk/res/android" android:fromXDelta="0" android:toXDelta="200" android:duration="500"/>
// 在Activity中加载动画 val anim = AnimationUtils.loadAnimation(this, R.anim.move) imageView.startAnimation(anim)
ObjectAnimator
ObjectAnimator.ofFloat(imageView, "translationX", 0f, 200f) .setDuration(500) .start()
// 同时实现x/y轴移动+旋转 val animator = ObjectAnimator.ofPropertyValuesHolder( imageView, PropertyValuesHolder.ofFloat("translationX", 0f, 300f), PropertyValuesHolder.ofFloat("translationY", 0f, 300f), PropertyValuesHolder.ofFloat("rotation", 0f, 360f) ) animator.duration = 1000 animator.start()
// 使用Modifier实现点击移动 var isMoved by remember { mutableStateOf(false) } Box(modifier = Modifier .size(100.dp) .background(Color.Red) .clickable { isMoved = !isMoved } .offset { if (isMoved) IntOffset(200, 200) else IntOffset(0, 0) } .animations( AnimatedVisibility(isMoved), AnimatedContentSize(), animationSpec = tween(500) ) )
特性 | 补间动画 | 属性动画 | Compose动画 |
---|---|---|---|
作用对象 | View整体 | 单个属性 | 任意修饰符 |
扩展性 | 低(仅预定义类型) | 高(可组合多属性) | 中等(依赖Modifier) |
兼容性 | 支持API 11+ | 支持API 11+ | API 29+ |
链式动画 | 需AnimationSet |
AnimatorSet 支持 |
内置链式机制 |
逆向动画 | 需重新配置 | 自动支持 | 自动支持 |
A:补间动画通过计算中间帧直接修改视图属性(如坐标),不改变视图实际状态;属性动画通过反射机制修改属性值,可触发视图布局流程,适合复杂交互。
A:使用PathInterpolator
配合属性动画:
// 创建贝塞尔曲线路径 val path = Path().apply { cubicTo(100f, 50f, 200f, 150f, 300f, 50f) } val interpolator = PathInterpolator(path) ObjectAnimator.ofFloat(view, "x", 0f, 300f) .setDuration(1000) .setInterpolator(interpolator) .start()