当前位置:首页 > 行业动态 > 正文

安卓开发动画移动

补间动画实现移动

使用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()

Jetpack Compose动画

// 使用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支持 内置链式机制
逆向动画 需重新配置 自动支持 自动支持

常见问题解答

Q1:补间动画与属性动画的本质区别?

A:补间动画通过计算中间帧直接修改视图属性(如坐标),不改变视图实际状态;属性动画通过反射机制修改属性值,可触发视图布局流程,适合复杂交互。

Q2:如何实现曲线路径移动?

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()