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

求助:多圆形进度条XML实现,此前提问被标记重复仍未获解

实现多圆形进度条的XML方案

我明白你找了好久没找到合适的XML实现多圆形进度条的方法,其实有两种比较实用的方案,都是纯XML配合少量代码就能搞定,我给你详细讲讲:

方案一:用FrameLayout嵌套多个独立进度条(最灵活)

这种方法适合需要多层环形进度条,且每层进度独立可控的场景。核心思路是把多个圆形进度条叠加在FrameLayout里,通过调整每个进度条的尺寸、颜色来实现多层效果。

步骤1:创建单个圆形进度条的Drawable

先给每层进度条写一个单独的Drawable文件,比如circular_progress_outer.xml:

<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270" <!-- 让进度从顶部开始,默认是右侧 -->
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="3" <!-- 内环半径是控件尺寸的1/3 -->
        android:shape="ring"
        android:thicknessRatio="15" <!-- 环的厚度是控件尺寸的1/15 -->
        android:useLevel="true"> <!-- 必须设为true,才能让ProgressBar控制进度 -->
        <solid android:color="#FF4081" /> <!-- 外层进度条颜色 -->
    </shape>
</rotate>

再复制两个文件circular_progress_middle.xml和circular_progress_inner.xml,修改颜色(比如#FF9800和#4CAF50),也可以调整innerRadiusRatio让内层环更小。

步骤2:在布局里嵌套进度条

用FrameLayout把多个ProgressBar叠起来,中间还可以加文本显示:

<FrameLayout
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:layout_gravity="center">

    <!-- 最外层进度条 -->
    <ProgressBar
        android:id="@+id/progress_outer"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        android:indeterminate="false" <!-- 关闭无限旋转模式 -->
        android:progress="75" <!-- 初始进度 -->
        android:progressDrawable="@drawable/circular_progress_outer" />

    <!-- 中间层进度条,尺寸缩小,居中显示 -->
    <ProgressBar
        android:id="@+id/progress_middle"
        android:layout_width="160dp"
        android:layout_height="160dp"
        android:layout_gravity="center"
        android:indeterminate="false"
        android:progress="50"
        android:progressDrawable="@drawable/circular_progress_middle" />

    <!-- 最内层进度条,尺寸再缩小 -->
    <ProgressBar
        android:id="@+id/progress_inner"
        android:layout_width="120dp"
        android:layout_height="120dp"
        android:layout_gravity="center"
        android:indeterminate="false"
        android:progress="25"
        android:progressDrawable="@drawable/circular_progress_inner" />

    <!-- 可选:中间显示文本 -->
    <TextView
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_gravity="center"
        android:text="多层进度"
        android:textSize="18sp" />
</FrameLayout>

步骤3:动态修改进度(可选)

如果需要在代码里更新进度,直接获取每个ProgressBar调用setProgress()即可:

ProgressBar outerProgress = findViewById(R.id.progress_outer);
outerProgress.setProgress(80); // 更新外层进度为80%

方案二:用LayerList实现单个Drawable多层进度

如果不需要每层进度独立控制,或者想把多层进度作为一个整体,可以用LayerList把多个环形Drawable叠加成一个,再用ProgressBar控制。

创建multi_circular_progress.xml:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <!-- 背景环(灰色) -->
    <item>
        <shape
            android:innerRadiusRatio="3"
            android:shape="ring"
            android:thicknessRatio="15"
            android:useLevel="false"> <!-- 背景环不需要随进度变化,设为false -->
            <solid android:color="#E0E0E0" />
        </shape>
    </item>
    <!-- 第一层进度环(粉色) -->
    <item>
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">
            <shape
                android:innerRadiusRatio="3"
                android:shape="ring"
                android:thicknessRatio="15"
                android:useLevel="true">
                <solid android:color="#FF4081" />
            </shape>
        </rotate>
    </item>
    <!-- 第二层进度环(橙色,缩小内环半径) -->
    <item>
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">
            <shape
                android:innerRadiusRatio="3.5"
                android:shape="ring"
                android:thicknessRatio="15"
                android:useLevel="true">
                <solid android:color="#FF9800" />
            </shape>
        </rotate>
    </item>
    <!-- 第三层进度环(绿色,再缩小内环半径) -->
    <item>
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">
            <shape
                android:innerRadiusRatio="4"
                android:shape="ring"
                android:thicknessRatio="15"
                android:useLevel="true">
                <solid android:color="#4CAF50" />
            </shape>
        </rotate>
    </item>
</layer-list>

然后在布局里用一个ProgressBar引用这个Drawable:

<ProgressBar
    android:layout_width="200dp"
    android:layout_height="200dp"
    android:indeterminate="false"
    android:progress="60"
    android:progressDrawable="@drawable/multi_circular_progress" />

注意:这种方案下,所有层的进度会同步变化,如果需要独立控制每层进度,还是方案一更合适。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 04:47:57