求助:多圆形进度条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
相关产品推荐
相关产品推荐

