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

