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
相关产品推荐
相关产品推荐

