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

如何在Drawable实现的启动页Theme中添加ProgressBar

解决方案:用LayerDrawable组合背景图与进度条

你遇到的核心问题是android:windowBackground只能设置单个Drawable,无法直接同时显示背景图和进度条。通过LayerDrawable将两者层叠,再配合动态更新进度条的level,就能实现带进度条的无白屏启动页。

步骤1:创建层叠的背景Drawable

在res/drawable/下新建splash_background.xml,将背景图和进度条Drawable组合:

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 底层:启动页背景图 -->
    <item android:drawable="@drawable/screen"/>

    <!-- 上层:居中显示的进度条 -->
    <item>
        <scale
            android:drawable="@drawable/progress_bar_drawable"
            android:scaleGravity="center"
            android:width="80dp"
            android:height="80dp"/>
    </item>
</layer-list>

步骤2:给进度条Drawable添加ID

修改你的进度条Drawable(progress_bar_drawable.xml),添加唯一ID方便后续获取:

<rotate
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/progress_drawable"
    android:fromDegrees="270"
    android:toDegrees="270">

    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="8dp"
        android:useLevel="true">
        <gradient
            android:angle="0"
            android:endColor="@color/red"
            android:startColor="#000000"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>

步骤3:更新Theme配置

将Theme中的android:windowBackground替换为刚才创建的层叠Drawable:

<style name="Theme.AppName.SplashScreen" parent="Theme.MaterialComponents.NoActionBar">
    <!-- 其他颜色配置保持不变 -->
    <item name="android:statusBarColor" tools:targetApi="l">?attr/colorPrimaryVariant</item>
    <!-- 替换为层叠背景 -->
    <item name="android:windowBackground">@drawable/splash_background</item>
</style>

步骤4:在启动页Activity中动态更新进度条

启动页Activity不需要设置setContentView,直接通过代码获取进度条Drawable并更新level(Android Drawable的level范围为0-10000):

class SplashActivity : AppCompatActivity() {
    override fun onCreate(savedInstanceState: Bundle?) {
        super.onCreate(savedInstanceState)

        // 获取窗口背景的LayerDrawable
        val splashBackground = window.decorView.background as LayerDrawable
        val progressDrawable = splashBackground.findDrawableByLayerId(R.id.progress_drawable) as RotateDrawable

        // 模拟加载任务,动态更新进度
        val handler = Handler(Looper.getMainLooper())
        var currentProgress = 0
        val updateRunnable = object : Runnable {
            override fun run() {
                currentProgress += 10
                // 设置进度,100对应level=10000
                progressDrawable.level = currentProgress * 100
                if (currentProgress < 100) {
                    handler.postDelayed(this, 100)
                } else {
                    // 加载完成,跳转主页面
                    startActivity(Intent(this@SplashActivity, MainActivity::class.java))
                    finish()
                }
            }
        }
        handler.post(updateRunnable)
    }
}

关键说明

  • LayerDrawable通过层级叠加实现多Drawable共存,底层是背景图,上层是进度条。
  • 进度条的useLevel="true"需要配合level值更新才能显示渐变动画,否则只会显示静态的环形。
  • 启动页不使用setContentView,完全依赖Theme的windowBackground,避免了Layout加载带来的延迟和白屏问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.17 00:15:43