如何创建循环进度条(饼图)像指标 - Android

Pau*_*aul 15 android android-progressbar

现在我有一个水平进度条,通过ProgressBar setProgress方法以编程方式更新:

<ProgressBar
            style="@android:style/Widget.ProgressBar.Horizontal"
            android:layout_width="0dip"
            android:layout_weight="1"
            android:layout_height="20dip"
            android:id="@+id/progressbar"
            >
    </ProgressBar>
Run Code Online (Sandbox Code Playgroud)

有没有办法将此进度条转换为圆形(饼图)并能够以编程方式更新进度?

我想要的例子:

dco*_*cow 20

您可以创建自定义视图(例如PieProgressView)或自定义Drawable(例如PieProgressDrawable).我采用了自定义视图方法,但要么完全可行.

快速浏览Android的ProgressView源代码会产生一个非常复杂的实现.显然,它们涵盖了所有基础,但你不必编写复杂的东西.我们真的只需要两件事:

  1. 跟踪当前进度的成员.
  2. 一种基于当前进度绘制饼图的方法.

第一个很简单,只需保留一个跟踪要绘制的饼图当前百分比的成员字段.2号有点复杂,但幸运的是,我们可以使用标准的Canvas绘制方法.

方便的是,Android的Canvas类提供了drawArc()方法.您可以使用它来获得Pie效果.假设我们将一个名为mPercent的成员字段中的百分比存储为0到1之间的浮点数,则onDraw()方法可能如下所示:

@Override
protected void onDraw(Canvas canvas) {

    final float startAngle = 0f;
    final float drawTo = startAngle + (mPercent * 360);

    // Rotate the canvas around the center of the pie by 90 degrees
    // counter clockwise so the pie stars at 12 o'clock.
    canvas.rotate(-90f, mArea.centerX(), mArea.centerY());
    canvas.drawArc(mArea, startAngle, drawTo, true, mPaint);

    // Draw inner oval and text on top of the pie (or add any other
    // decorations such as a stroke) here..
    // Don't forget to rotate the canvas back if you plan to add text!
    ...
}
Run Code Online (Sandbox Code Playgroud)

以下是示例应用中已完成视图的样子:

PieProgressView在行动!

编辑

自发布以来,我已经确定您没有理由需要实现自定义视图.您可以简单地使用drawable和它的level属性来完成所需的操作.我用完全的绘画做了一个要点.


Buf*_*alo 0

对于圆形进度条,请使用:

style="?android:attr/progressBarStyle"
Run Code Online (Sandbox Code Playgroud)

更多详细信息可以在这里找到:What's the meaning of android:progressBarStyle attribute in ProgressBar?

至于进度设置:圆形进度条会一直旋转。不再需要时只需将其隐藏即可。

或者您可以实现一些自定义功能:在其旁边显示一个 TextView 并更新它,而不是使用 Progressbar.setProgress。

Step 0: setText("0%");
Step 1 (2 seconds later): setText("3%");
Step 2 (4 seconds later): setText("9%"); etc.
Run Code Online (Sandbox Code Playgroud)