You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Android:如何用Animator替代Animation实现底部滑入动画?

用Animator实现底部滑入动画的方案

当然可以!完全能用Animator替代Animation实现你要的底部滑入效果,而且Animator(尤其是ObjectAnimator)相比传统Animation更灵活——它直接操作View的属性,而非仅在绘制阶段做偏移,能避免不少交互逻辑上的问题。

方式一:代码直接创建ObjectAnimator(推荐)

这种方式灵活性最高,能动态调整动画参数,下面是Kotlin和Java的实现示例:

Kotlin 代码:

val targetView = findViewById<View>(R.id.your_target_view)

// 创建动画:操作View的translationY属性,从自身高度位置滑到原位
val slideInAnimator = ObjectAnimator.ofFloat(
    targetView,
    "translationY",
    targetView.height.toFloat(), // 初始位置:对应原Animation的100%自身高度
    0f // 结束位置:回到View原本的位置
)

// 匹配原Animation的参数设置
slideInAnimator.duration = 250
slideInAnimator.interpolator = DecelerateInterpolator()

// 启动动画
slideInAnimator.start()

Java 代码:

View targetView = findViewById(R.id.your_target_view);

ObjectAnimator slideInAnimator = ObjectAnimator.ofFloat(
    targetView,
    "translationY",
    targetView.getHeight(),
    0f
);

slideInAnimator.setDuration(250);
slideInAnimator.setInterpolator(new DecelerateInterpolator());

slideInAnimator.start();

注意:如果在页面初始化阶段调用,targetView.getHeight()可能返回0(因为View还没完成布局渲染),这时可以通过ViewTreeObserver监听布局完成后再启动动画:

targetView.viewTreeObserver.addOnGlobalLayoutListener(object : ViewTreeObserver.OnGlobalLayoutListener {
    override fun onGlobalLayout() {
        // 移除监听避免重复触发
        targetView.viewTreeObserver.removeOnGlobalLayoutListener(this)
        slideInAnimator.start()
    }
})

方式二:用XML定义Animator

如果你习惯用XML管理动画资源,可以在res/animator/目录下创建slide_in_bottom.xml(注意是animator目录,不是传统的anim目录):

<?xml version="1.0" encoding="utf-8"?>
<objectAnimator xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="250"
    android:interpolator="@android:anim/decelerate_interpolator"
    android:propertyName="translationY"
    android:valueFrom="100%p" <!-- 若需严格对应自身高度,可在代码中动态修改valueFrom,或替换为具体数值 -->
    android:valueTo="0"
    android:valueType="floatType" />

然后在代码中加载并启动:

val animator = AnimatorInflater.loadAnimator(this, R.animator.slide_in_bottom) as ObjectAnimator
animator.target = findViewById<View>(R.id.your_target_view)
animator.start()

效果等价性说明

原Animation的<translate>是通过修改View的绘制偏移实现视觉滑动,而Animator的translationY是直接修改View的布局属性,视觉效果完全一致,但Animator的方式能让View的点击区域等交互逻辑同步跟随滑动,体验更完善。

内容的提问来源于stack exchange,提问作者Augusto Carmo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.21 08:15:05