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

如何让Android加载完成时ProgressBar到ImageView的过渡动画更流畅?

实现ProgressBar与ImageView的平滑过渡动画

以下是几种简便的实现方案,无需复杂配置就能解决切换生硬的问题:

方案一:使用ViewPropertyAnimator(最轻量化)

直接通过代码控制视图的透明度渐变,无需额外资源文件:

从ProgressBar切换到ImageView

progressBar.animate()
    .alpha(0f)
    .setDuration(300) // 过渡时长,单位毫秒
    .withEndAction {
        progressBar.visibility = View.GONE
        // 先设置ImageView透明再显示,避免突然出现
        imageView.alpha = 0f
        imageView.visibility = View.VISIBLE
        imageView.animate().alpha(1f).setDuration(300).start()
    }

从ImageView切换回ProgressBar(如果需要)

imageView.animate()
    .alpha(0f)
    .setDuration(300)
    .withEndAction {
        imageView.visibility = View.GONE
        progressBar.alpha = 0f
        progressBar.visibility = View.VISIBLE
        progressBar.animate().alpha(1f).setDuration(300).start()
    }

方案二:使用TransitionManager(AndroidX过渡框架,极简)

借助AndroidX的过渡框架,只需一行代码开启布局过渡,自动处理动画:

  1. 确保项目依赖AndroidX Transition(一般新项目默认已包含):
implementation 'androidx.transition:transition:1.4.1'
  1. 切换视图时的代码:
// parentLayout 是ProgressBar和ImageView共同的父布局
TransitionManager.beginDelayedTransition(parentLayout)
progressBar.visibility = View.GONE
imageView.visibility = View.VISIBLE

默认会使用淡入淡出过渡,如果需要自定义时长或过渡类型:

val fadeTransition = Fade()
fadeTransition.duration = 300
TransitionManager.beginDelayedTransition(parentLayout, fadeTransition)
progressBar.visibility = View.GONE
imageView.visibility = View.VISIBLE

方案三:使用XML动画(适合多场景复用)

如果需要在多个地方复用过渡动画,可以定义XML动画文件:

  1. 创建淡出动画 res/anim/fade_out.xml:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromAlpha="1.0"
    android:toAlpha="0.0" />
  1. 创建淡入动画 res/anim/fade_in.xml:
<?xml version="1.0" encoding="utf-8"?>
<alpha xmlns:android="http://schemas.android.com/apk/res/android"
    android:duration="300"
    android:fromAlpha="0.0"
    android:toAlpha="1.0" />
  1. 代码中调用动画:
val fadeOut = AnimationUtils.loadAnimation(context, R.anim.fade_out)
val fadeIn = AnimationUtils.loadAnimation(context, R.anim.fade_in)

fadeOut.setAnimationListener(object : Animation.AnimationListener {
    override fun onAnimationStart(animation: Animation?) {}
    override fun onAnimationEnd(animation: Animation?) {
        progressBar.visibility = View.GONE
        imageView.visibility = View.VISIBLE
        imageView.startAnimation(fadeIn)
    }
    override fun onAnimationRepeat(animation: Animation?) {}
})

progressBar.startAnimation(fadeOut)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 07:18:19