如何在Android中创建一个可以旋转的圆形进度条?

204

我正在尝试创建一个圆形进度条。这就是我想要实现的效果:

有一个灰色背景环,其上方出现一个蓝色进度条,以60秒或其他时间为周期,在圆形路径上从0到360移动。

图片描述

这是我的示例代码。

<ProgressBar
            android:id="@+id/ProgressBar"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            style="?android:attr/progressBarStyleLarge"
            android:indeterminateDrawable="@drawable/progressBarBG"
            android:progress="50"
            />
为了实现这一点,在可绘制的"progressBarBG"中,我创建了一个图层列表,该列表内部包含两个如下所示的项目。
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape
            android:shape="ring"
            android:innerRadius="64dp"
            android:thickness="8dp"
            android:useLevel="false">

        <solid android:color="@color/grey" />
    </shape>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape
                android:shape="ring"
                android:innerRadius="64dp"
                android:thickness="8dp"
                android:useLevel="false">

            <solid android:color="@color/blue" />
        </shape>
    </clip>
</item>

现在,第一个灰色环已经正确生成。但是蓝色环从绘图区域的左侧开始,并像线性进度条一样向右移动。这就是在50%进度时显示红色箭头表示方向的方式。

图片描述

我想把蓝色进度条移动到预期的圆形路径上。


1
在发布这个问题之前,我做了一些搜索。我找到了一些答案,但它们对我想要实现的内容无效。也许有人认为这是一个重复的帖子而将其踩了下来。 - Saurav Srivastava
我认为您需要一个定制化的解决方案。当ProgressBar不处于不确定模式时,它使用剪辑可绘制对象来剪辑可绘制对象的进度层。但是,剪辑可绘制对象仅在水平或垂直方向上工作,而不是作为角形楔。我认为您将不得不创建Drawable子类来绘制跨越getLevel()*360度的弧形。然后,由于您无法在xml drawable中使用自定义视图,因此您将不得不对ProgressBar进行子类化,以便它直接使用您的自定义Drawable。 - Tenfour04
请查看此帖子:https://dev59.com/62cs5IYBdhLWcg3wh0b7 - Yjay
1
也许这可以指引你朝着正确的方向前进 https://github.com/grmaciel/two-level-circular-progress-bar - gmemario
1
你可以使用这个库 https://github.com/emre1512/CircleProgressBar - Zapdos
显示剩余3条评论
16个回答

388

以下是我的两个解决方案。

简短回答:

我没有创建 layer-list,而是将其分成了两个文件。一个是用于 ProgressBar 的文件,另一个是用于背景的文件。

这是 ProgressDrawable 文件(@drawable folder):circular_progress_bar.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="1dp"
        android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->

        <gradient
            android:angle="0"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>

这是关于它的背景(@drawable文件夹)的:circle_shape.xml

<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadiusRatio="2.5"
    android:thickness="1dp"
    android:useLevel="false">

    <solid android:color="#CCC" />

</shape>

最后,在你正在工作的布局内部:

<ProgressBar
        android:id="@+id/progressBar"
        android:layout_width="200dp"
        android:layout_height="200dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/circular_progress_bar"
        android:background="@drawable/circle_shape"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100"
        android:progress="65" />

这是结果:

result 1

长答案:

使用一个继承 android.view.View 的自定义视图

result 2

这是完整的项目 on github 上的链接


@Pedram 我应该如何设置进度条的百分比?例如,目前是50%。我应该如何将这个50%设置到进度条上? - user2424370
@Pedram,你的旧解决方案肯定更好!请检查我在页面下面的答案并修复你的解决方案(我无法将其作为评论发布--太长了!) - mim
1
@MimArmand 嘿,谢谢,实际上它在棒棒糖5.1更新后又开始工作了,而那行代码修复了API 21的问题。 - M. Reza Nasirloo
@Pedran非常感谢您的回答,似乎将useLevel设置为true也在5.0.2上帮助了我。您知道使用该属性的原因吗?我以前从未使用过... - Zsolt Boldizsar
显示剩余13条评论

35

使用 Material Components 库,您可以使用 CircularProgressIndicator

类似于:

<com.google.android.material.progressindicator.CircularProgressIndicator
    app:indicatorColor="@color/...."
    app:trackColor="@color/...."
    app:indicatorSize="64dp"/>

您可以使用以下属性:

  • indicatorSize: 定义圆形进度指示器的半径
  • trackColor: 用于进度轨迹的颜色。如果未定义,它将设置为indicatorColor并应用主题中的 android:disabledAlpha
  • indicatorColor: 确定/不确定模式下指示器使用的单一颜色。默认情况下,它使用主题的基本颜色

enter image description here

使用progressIndicator.setProgressCompat((int) value, true);更新指示器中的值。

注意:这需要至少版本1.3.0-alpha04


需要哪些库依赖? - bikram
@bikram 谷歌提供的Material Components库 - Gabriele Mariotti
1
我在build.gradle中添加了implementation 'com.google.android.material:material:1.1.0',但是ProgressIndicator仍然没有出现。 - bikram
1
如答案所述:它需要至少版本为“1.3.0-alpha01”。 - Gabriele Mariotti
2
这看起来是最新的答案。 - Nadimuddin

32

我已经用简单的方法完成了:

请查看屏幕截图。

CustomProgressBarActivity.java

public class CustomProgressBarActivity extends AppCompatActivity {

    private TextView txtProgress;
    private ProgressBar progressBar;
    private int pStatus = 0;
    private Handler handler = new Handler();

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_custom_progressbar);

        txtProgress = (TextView) findViewById(R.id.txtProgress);
        progressBar = (ProgressBar) findViewById(R.id.progressBar);

        new Thread(new Runnable() {
            @Override
            public void run() {
                while (pStatus <= 100) {
                    handler.post(new Runnable() {
                        @Override
                        public void run() {
                            progressBar.setProgress(pStatus);
                            txtProgress.setText(pStatus + " %");
                        }
                    });
                    try {
                        Thread.sleep(100);
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    pStatus++;
                }
            }
        }).start();

    }
}

activity_custom_progressbar.xml:

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context="com.skholingua.android.custom_progressbar_circular.MainActivity" >


    <RelativeLayout
        android:layout_width="wrap_content"
        android:layout_centerInParent="true"
        android:layout_height="wrap_content">

        <ProgressBar
            android:id="@+id/progressBar"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="250dp"
            android:layout_height="250dp"
            android:layout_centerInParent="true"
            android:indeterminate="false"
            android:max="100"
            android:progress="0"
            android:progressDrawable="@drawable/custom_progressbar_drawable"
            android:secondaryProgress="0" />


        <TextView
            android:id="@+id/txtProgress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignBottom="@+id/progressBar"
            android:layout_centerInParent="true"
            android:textAppearance="?android:attr/textAppearanceSmall" />
    </RelativeLayout>



</RelativeLayout>

custom_progressbar_drawable.xml

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="-90"
    android:pivotX="50%"
    android:pivotY="50%"
    android:toDegrees="270" >

    <shape
        android:shape="ring"
        android:useLevel="false" >
        <gradient
            android:centerY="0.5"
            android:endColor="#FA5858"
            android:startColor="#0099CC"
            android:type="sweep"
            android:useLevel="false" />
    </shape>

</rotate>

希望这能对你有所帮助。


嗨,Hiren,我正在尝试在视图中仅显示两种颜色:红色和绿色。但是我也看到圆圈中有一些混合的红色和绿色。我该如何去除它? - Lokesh Pandey

29

我在我的博客demonuts.com上写了关于Android圆形进度条的详细示例。你也可以在那里找到完整的源代码和说明。

以下是我如何在纯代码中制作带有百分比的圆形进度条,而不使用任何库。

进入图像描述

首先创建一个名为circular.xml的可绘制文件。

<?xml version="1.0" encoding="utf-8"?>

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/secondaryProgress">
        <shape
            android:innerRadiusRatio="6"
            android:shape="ring"
            android:thicknessRatio="20.0"
            android:useLevel="true">


            <gradient
                android:centerColor="#999999"
                android:endColor="#999999"
                android:startColor="#999999"
                android:type="sweep" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <rotate
            android:fromDegrees="270"
            android:pivotX="50%"
            android:pivotY="50%"
            android:toDegrees="270">

            <shape
                android:innerRadiusRatio="6"
                android:shape="ring"
                android:thicknessRatio="20.0"
                android:useLevel="true">


                <rotate
                    android:fromDegrees="0"
                    android:pivotX="50%"
                    android:pivotY="50%"
                    android:toDegrees="360" />

                <gradient
                    android:centerColor="#00FF00"
                    android:endColor="#00FF00"
                    android:startColor="#00FF00"
                    android:type="sweep" />

            </shape>
        </rotate>
    </item>
</layer-list>

现在在你的 activity_main.xml 文件中添加以下内容:

  <?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:background="@color/dialog"
    tools:context="com.example.parsaniahardik.progressanimation.MainActivity">

    <ProgressBar

        android:id="@+id/circularProgressbar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:indeterminate="false"
        android:max="100"
        android:progress="50"
        android:layout_centerInParent="true"
        android:progressDrawable="@drawable/circular"
        android:secondaryProgress="100"
        />

    <ImageView
        android:layout_width="90dp"
        android:layout_height="90dp"
        android:background="@drawable/whitecircle"
        android:layout_centerInParent="true"/>

    <TextView
        android:id="@+id/tv"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:gravity="center"
        android:text="25%"
        android:layout_centerInParent="true"
        android:textColor="@color/colorPrimaryDark"
        android:textSize="20sp" />

</RelativeLayout>
activity_main.xml中,我使用了一个带有白色背景的圆形图像来显示百分比周围的白色背景。下面是这张图片:

enter image description here

您可以更改此图像的颜色以设置自定义颜色在百分比文本周围。
现在最后添加以下代码到MainActivity.java
import android.content.res.Resources;
import android.graphics.drawable.Drawable;
import android.os.Handler;
import android.support.v7.app.AppCompatActivity;
import android.os.Bundle;
import android.view.animation.DecelerateInterpolator;
import android.widget.ProgressBar;
import android.widget.TextView;

public class MainActivity extends AppCompatActivity {

    int pStatus = 0;
    private Handler handler = new Handler();
    TextView tv;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        Resources res = getResources();
        Drawable drawable = res.getDrawable(R.drawable.circular);
        final ProgressBar mProgress = (ProgressBar) findViewById(R.id.circularProgressbar);
        mProgress.setProgress(0);   // Main Progress
        mProgress.setSecondaryProgress(100); // Secondary Progress
        mProgress.setMax(100); // Maximum Progress
        mProgress.setProgressDrawable(drawable);

      /*  ObjectAnimator animation = ObjectAnimator.ofInt(mProgress, "progress", 0, 100);
        animation.setDuration(50000);
        animation.setInterpolator(new DecelerateInterpolator());
        animation.start();*/

        tv = (TextView) findViewById(R.id.tv);
        new Thread(new Runnable() {

            @Override
            public void run() {
                // TODO Auto-generated method stub
                while (pStatus < 100) {
                    pStatus += 1;

                    handler.post(new Runnable() {

                        @Override
                        public void run() {
                            // TODO Auto-generated method stub
                            mProgress.setProgress(pStatus);
                            tv.setText(pStatus + "%");

                        }
                    });
                    try {
                        // Sleep for 200 milliseconds.
                        // Just to display the progress slowly
                        Thread.sleep(8); //thread will take approx 1.5 seconds to finish
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                }
            }
        }).start();
    }
}

如果你想制作水平进度条,请访问以下链接。该链接包含许多有价值的示例和源代码:
http://www.skholingua.com/android-basic/user-interface/form-widgets/progressbar


漂亮又好看的进度条!但我不明白为什么你要使用 PNG 图片作为背景,而不是复合绘制对象,所以这里是它:`<shape xmlns:android="http://schemas.android.com/apk/res/android" android:shape="oval"
<corners android:radius="1dp" /> <solid android:color="@android:color/white" /> <size android:width="250dp" android:height="250dp" /></shape>`
- Acuna

22

我发现了一个在GitHub上的 开源库CircularProgressBar,可以以最简单的方式实现你所需要的功能:

Gif演示CircularProgressBar

使用方法

要创建一个圆形进度条,请在您的布局XML中添加CircularProgressBar并在您的项目中添加CircularProgressBar库,或者您也可以通过Gradle获取:

compile 'com.mikhaellopez:circularprogressbar:1.0.0'

XML

<com.mikhaellopez.circularprogressbar.CircularProgressBar
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    app:background_progressbar_color="#FFCDD2"
    app:background_progressbar_width="5dp"
    app:progressbar_color="#F44336"
    app:progressbar_width="10dp" />

您必须在XML中使用以下属性来更改CircularProgressBar。

属性:

  • app:progress (integer) >> 默认值0
  • app:progressbar_color (color) >> 默认为黑色
  • app:background_progressbar_color (color) >> 默认为灰色
  • app:progressbar_width (dimension) >> 默认为7dp
  • app:background_progressbar_width (dimension) >> 默认为3dp

JAVA

CircularProgressBar circularProgressBar = (CircularProgressBar)findViewById(R.id.yourCircularProgressbar);
circularProgressBar.setColor(ContextCompat.getColor(this, R.color.progressBarColor));
circularProgressBar.setBackgroundColor(ContextCompat.getColor(this, R.color.backgroundProgressBarColor));
circularProgressBar.setProgressBarWidth(getResources().getDimension(R.dimen.progressBarWidth));
circularProgressBar.setBackgroundProgressBarWidth(getResources().getDimension(R.dimen.backgroundProgressBarWidth));
int animationDuration = 2500; // 2500ms = 2,5s
circularProgressBar.setProgressWithAnimation(65, animationDuration); // Default duration = 1500ms

在这里分叉或下载这个库 >> https://github.com/lopspower/CircularProgressBar


我尝试了这个,真的很棒,但现在找不到任何动画变化监听器。你知道有什么方法吗? - Md Imran Choudhury
@lopez.mikhael 你有什么想法可以在圆形之间添加图片吗? - QWERTY
@DeniseTan 您可以简单地使用FrameLayout或RelativeLayout来实现。 - lopez.mikhael

16

这是一个简单的自定义视图,用于显示圆形进度。您可以根据需要进行修改和优化,以适应您的项目。

class CircleProgressBar @JvmOverloads constructor(
        context: Context, attrs: AttributeSet? = null, defStyleAttr: Int = 0
) : View(context, attrs, defStyleAttr) {
    private val backgroundWidth = 10f
    private val progressWidth = 20f

    private val backgroundPaint = Paint().apply {
        color = Color.LTGRAY
        style = Paint.Style.STROKE
        strokeWidth = backgroundWidth
        isAntiAlias = true
    }

    private val progressPaint = Paint().apply {
        color = Color.RED
        style = Paint.Style.STROKE
        strokeWidth = progressWidth
        isAntiAlias = true
    }

    var progress: Float = 0f
        set(value) {
            field = value
            invalidate()
        }

    private val oval = RectF()
    private var centerX: Float = 0f
    private var centerY: Float = 0f
    private var radius: Float = 0f

    override fun onSizeChanged(w: Int, h: Int, oldw: Int, oldh: Int) {
        centerX = w.toFloat() / 2
        centerY = h.toFloat() / 2
        radius = w.toFloat() / 2 - progressWidth
        oval.set(centerX - radius,
                centerY - radius,
                centerX + radius,
                centerY + radius)
        super.onSizeChanged(w, h, oldw, oldh)
    }

    override fun onDraw(canvas: Canvas?) {
        super.onDraw(canvas)
        canvas?.drawCircle(centerX, centerY, radius, backgroundPaint)
        canvas?.drawArc(oval, 270f, 360f * progress, false, progressPaint)
    }
}

使用示例

xml

<com.example.androidcircleprogressbar.CircleProgressBar
    android:id="@+id/circle_progress"
    android:layout_width="200dp"
    android:layout_height="200dp" />

kotlin

->

Kotlin

class MainActivity : AppCompatActivity() {
    val TOTAL_TIME = 10 * 1000L

    override fun onCreate(savedInstanceState: Bundle?) {
        ...

        timeOutRemoveTimer.start()
    }

    private var timeOutRemoveTimer = object : CountDownTimer(TOTAL_TIME, 10) {
        override fun onFinish() {
            circle_progress.progress = 1f
        }

        override fun onTick(millisUntilFinished: Long) {
            circle_progress.progress = (TOTAL_TIME - millisUntilFinished).toFloat() / TOTAL_TIME
        }
    }
}

结果


谢谢,这个运行得很好。还有一个问题,我怎么能手动完成进度呢? - Zaigham Raza
我该如何禁用背景布局,因为它的行为就像透明一样。 - Zaigham Raza

5

我是新手,所以无法评论,但想分享一个懒人修复方法。我也使用了Pedram的原始方法,最近遇到了同样的Lollipop问题。但是在另一篇帖子中alanv提供了一个一行代码的解决方案。这是API21中某种错误或疏忽。只需在您的圆形进度条xml中添加android:useLevel="true"即可。Pedram的新方法仍然是正确的修复方法,但我想分享这个懒人修复方法。


5

enter image description here

<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="match_parent"
    android:layout_height="match_parent">
    <ProgressBar
        android:id="@+id/progress_circular_id"
        android:layout_width="250dp"
        android:layout_height="250dp"
        android:layout_centerInParent="true"
        android:indeterminate="false"
        android:progress="30"
        android:progressDrawable="@drawable/circular_progress_bar"
        android:background="@drawable/circle_shape"
        style="?android:attr/progressBarStyleHorizontal"
        android:max="100">
    </ProgressBar>
    <TextView
        android:id="@+id/textview_progress_status_id"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="50%"
        android:layout_centerInParent="true"
        android:textStyle="bold"
        android:textColor="@color/blue"
        android:textSize="35dp">
    </TextView>

    <Button
        android:id="@+id/check"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_marginTop="50dp"
        android:text="click me"
        android:textColor="@color/white"
        android:layout_below="@+id/progress_circular_id"
        android:layout_centerHorizontal="true"
        >
    </Button>
</RelativeLayout>

创建一个文件名为circle_shape.xml的Drawable文件。
<?xml version="1.0" encoding="utf-8"?>
<shape
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="ring"
    android:innerRadiusRatio="2.5"
    android:thickness="25dp"
    android:useLevel="false">
    <solid android:color="#CCC" />

</shape>

创建一个名为 circular_progress_bar.xml 的文件。
<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="25dp"
        android:useLevel="true"><!-- this line fixes the issue for lollipop api 21 -->

        <gradient
            android:angle="0"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>

在Java中,文件示例使用片段。

public class FragmentRegistration extends BaseFragmentHelper {
    View registrationFragmentView;
    ProgressBar progressBar;
    Button button;
    int count=0;
    @Override
    public void onAttachFragment(@NonNull Fragment childFragment) {
        super.onAttachFragment(childFragment);
    }

    @Override
    public void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    }

    @Nullable
    @Override
    public View onCreateView(@NonNull LayoutInflater inflater, @Nullable ViewGroup container, @Nullable Bundle savedInstanceState) {
        registrationFragmentView = inflater.inflate(R.layout.new_device_registration, container, false);
        progressBar=(ProgressBar)registrationFragmentView.findViewById(R.id.progress_circular_id);
        button=(Button) registrationFragmentView.findViewById(R.id.check);
        button.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                count=count+10;
                progressBar.setProgress(count);
            }
        });
        return registrationFragmentView;
    }

    @Override
    public void onActivityCreated(@Nullable Bundle savedInstanceState) {
        super.onActivityCreated(savedInstanceState);
    }

    @Override
    public void onStart() {
        super.onStart();
    }

    @Override
    public void onResume() {
        super.onResume();
    }

    @Override
    public void onDetach() {
        super.onDetach();
    }

    @Override
    public void onDestroy() {
        super.onDestroy();
    }

    @Override
    public void onDestroyView() {
        super.onDestroyView();
    }
}

1
你把它弄复杂了,保持简单。 - Harikrushna Patel
@HarikrushnaPatel 您能否指出复杂性并粘贴您提到的简单代码。 - vinay shetty

4
尝试这种方法来创建位图并将其设置到图像视图中。
private void circularImageBar(ImageView iv2, int i) {


    Bitmap b = Bitmap.createBitmap(300, 300,Bitmap.Config.ARGB_8888);
    Canvas canvas = new Canvas(b); 
    Paint paint = new Paint();

        paint.setColor(Color.parseColor("#c4c4c4"));
        paint.setStrokeWidth(10);
        paint.setStyle(Paint.Style.STROKE);
        canvas.drawCircle(150, 150, 140, paint);

        paint.setColor(Color.parseColor("#FFDB4C"));
        paint.setStrokeWidth(10);   
        paint.setStyle(Paint.Style.FILL);
        final RectF oval = new RectF();
        paint.setStyle(Paint.Style.STROKE);
        oval.set(10,10,290,290);

        canvas.drawArc(oval, 270, ((i*360)/100), false, paint);
        paint.setStrokeWidth(0);    
        paint.setTextAlign(Align.CENTER);
        paint.setColor(Color.parseColor("#8E8E93")); 
        paint.setTextSize(140);

        canvas.drawText(""+i, 150, 150+(paint.getTextSize()/3), paint); 

        iv2.setImageBitmap(b);
}

3

@Pedram,你的旧解决方案在Lollipop版本中实际上也可以正常工作(而且比新解决方案更好,因为它可以在任何地方使用,包括在远程视图中)。只需将你的circular_progress_bar.xml代码更改为以下内容:

<?xml version="1.0" encoding="utf-8"?>
<rotate xmlns:android="http://schemas.android.com/apk/res/android"
    android:fromDegrees="270"
    android:toDegrees="270">
    <shape
        android:innerRadiusRatio="2.5"
        android:shape="ring"
        android:thickness="1dp"
        android:useLevel="true"> <!-- Just add this line -->
        <gradient
            android:angle="0"
            android:endColor="#007DD6"
            android:startColor="#007DD6"
            android:type="sweep"
            android:useLevel="false" />
    </shape>
</rotate>

2
关于 android:useLevel="true" 的优秀评论!!!您帮助我解决了 Android 5 上的重要问题!非常感谢您! - DmitryKanunnikoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接