如何让 ProgressBar 停止旋转?

How to make ProgressBar stop spinning?

提问人:greenoldman 提问时间:10/17/2012 更新时间:4/30/2021 访问量:29608

问:

当我添加水平 ProgressBar 时,它的行为符合预期 - 我设置了进度值并显示它。

但是,当我添加 ProgressBar(圆形)时,它会旋转。就是这样。在这种形式下,它更像是“请稍候”的指示器,即任何进度条,因为进度值不显示。

所以我的问题是(假设名称中的进度意味着进步)——如何停止旋转并显示进度值?例如,如果我将 max 设置为 100,将 value 设置为 50,我希望看到半圆弧。

换句话说,如何使圆形 ProgressBar 的行为类似于水平 ProgressBar,只有形状除外?

安卓 android-progressbar

评论

0赞 toadzky 10/17/2012
圆形进度条被称为“不确定”是有原因的。您可能需要创建某种类型的自定义可绘制对象。
0赞 greenoldman 10/17/2012
我设置为 false。但是,如果无论我设置什么,图像都根本没有改变,那么 AND 有什么用?indeterminateprogressmax
0赞 Cat 10/17/2012
ProgressBar使用时应该是一个实际的条形图。就像您在 Google 云端硬盘上下载文件一样。我们能看到您正在使用的代码吗?indeterminate
2赞 greenoldman 10/17/2012
@Eric,没有代码,我拖放了圆形 ProgressBar,但无论我如何配置它,它都会旋转。即 和 值被完全忽略。maxprogress

答:

3赞 Geobits 10/17/2012 #1

就像 toadzky 评论的那样,没有烘焙方法。你可以试试这个 ProgressWheel。如果不出意外,它应该让您了解如何实现它。

评论

2赞 greenoldman 10/17/2012
谢谢。奇怪的是,这种有缺陷的代码首先被发布(ProgressBar)。
2赞 Geobits 10/17/2012
没有问题,但它不是真正的错误。它完全符合它的设计目的。圆形的是在您不知道某件事需要多长时间时使用。Android 界面始终使用条形图来表示“完成百分比”,并使用圆形来表示“正在进行的工作”,以便用户理解每个字形的含义。
2赞 greenoldman 10/17/2012
好的,但是“正在进行的工作”不需要这样的属性。它是打开或关闭的。添加死属性是设计缺陷(或错误)。
8赞 yshahak 3/3/2016 #2

因为你可以做这样的事情: 假设你是这样发现的:Api 21ProgressBar

 <ProgressBar xmlns:android="http://schemas.android.com/apk/res/android"
    style="?android:attr/progressBarStyleLarge"
    android:id="@+id/progress_bar"
    android:layout_width="@dimen/item_width"
    android:layout_height="@dimen/item_height"
    android:clickable="false"
    android:indeterminate="true"
    android:indeterminateDrawable="@drawable/progress"/>

这是:progress.xml

<shape
    android:innerRadiusRatio="3"
    android:shape="ring"
    android:thicknessRatio="8"
    android:useLevel="false" >

    <size
        android:height="76dip"
        android:width="76dip" />

    <gradient
        android:angle="0"
        android:endColor="@color/colorGrayText"
        android:startColor="@android:color/transparent"
        android:type="sweep"
        android:useLevel="false" />

</shape>

现在您可以在以下位置执行此操作:ProgressBar

 ProgressBar progressBar = (ProgressBar) findViewById(R.id.progress_bar);
        if (progressBar != null) {
            if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) {
                RotateDrawable rotateDrawable = (RotateDrawable) progressBar.getIndeterminateDrawable();
                rotateDrawable.setToDegrees(0);
            }
        }

评论

1赞 markdrake 2/28/2017
谢谢你提供这个解决方案,它对我来说非常有效。如果你愿意,你会如何重新开始旋转?
0赞 markdrake 2/28/2017
我意识到该怎么做,这段代码所做的是从 0 到 0 度旋转(并且看起来停止了),所以要重置旋转的动画,只需将旋转到 rotateDrawable.setToDegrees(360);这应该有效。我为任何寻找此答案的人添加了评论。
0赞 yshahak 2/28/2017
很棒的补充,伙计!如果可以的话,我可以将其添加到问题中。
0赞 Roee 5/8/2017
似乎我做错了什么,因为在将可绘制对象转换为 RotateDrawble 时我遇到了类异常。我以编程方式添加了进度条 progressBar = new ProgressBar(getContext());progressBar.setMax(maxDurationInMilliSec / 1000);progressBar.setProgress(0);progressBar.setIndeterminate(真);progressBar.setIndeterminateDrawable(getContext().getDrawable(R.drawable.circle_loader));
0赞 yshahak 5/8/2017
如果你没有按照我在答案中写的那样设置,你就不能像这样在这段代码中使用。android:indeterminateDrawablexml
19赞 Fabian Almaraz 5/19/2017 #3

我知道这是一个旧帖子,但我遇到了同样的问题,我让它工作。

实际上比您想象的要容易,您必须在 drawable 文件夹内的 xml 文件中设置自定义进度,并处理 < rotate > 标签中的属性“fromDegrees”和“toDegrees”:

这是custom_progress.xml的代码(您可以根据需要自定义您的代码,但不得修改“fromDegrees”和“toDegrees”)

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item android:id="@android:id/background">
        <shape
            android:innerRadiusRatio="2.3"
            android:shape="ring"
            android:useLevel="false"
            android:type="sweep"
            android:thicknessRatio="15.0">
            <solid android:color="#0099ff"/>
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <rotate
            android:pivotX="50%"
            android:pivotY="50%"
            android:fromDegrees="-90"
            android:toDegrees="-90">
            <shape
                android:innerRadiusRatio="2.3"
                android:shape="ring"
                android:angle="0"
                android:type="sweep"
                android:thicknessRatio="15.0">
                <solid android:color="#e0e0e0"/>
            </shape>
        </rotate>
    </item>
</layer-list>

对于进度条,您必须设置以下属性:

<ProgressBar
    android:id="@+id/progressbar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="100dp"
    android:layout_height="100dp"
    android:indeterminate="false"
    android:max="100"
    android:progress="20"
    android:progressDrawable="@drawable/custom_progress" />

这里发生的事情是,进度将从 -90 度开始,对我来说,这是进度条视图的顶部,并且向右,并且将继续向相同的度数前进,这将使视图以相同的度数开始和结束。

注意:如果将“fromDegrees”和“toDegrees”都设置为 0,则进度将从圆圈的右侧开始。

希望它能帮助有相同要求的人。

0赞 Sahil Bansal 8/17/2020 #4

对于确定的进度条,是指不继续旋转的进度条,用户可以设置固定的百分比。

<ProgressBar
                android:id="@+id/pb_sharpness"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                android:layout_width="@dimen/dp_50"
                android:layout_height="@dimen/dp_50"
                android:layout_marginTop="@dimen/dp_16"
                android:indeterminate="false"
                android:max="100"
                android:progressDrawable="@drawable/custom_progress_bar"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintStart_toStartOf="parent"
                app:layout_constraintTop_toTopOf="parent" />

用于将可绘制对象添加到进度条上方

 <?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
<item android:id="@android:id/background">
    <shape
        android:innerRadiusRatio="2.3"
        android:shape="ring"
        android:useLevel="false"
        android:type="sweep"
        android:thicknessRatio="15.0">
        <solid android:color="@color/white_color"/>
    </shape>
</item>
<item android:id="@android:id/progress">
    <rotate
        android:pivotX="50%"
        android:pivotY="50%"
        android:fromDegrees="180"
        android:toDegrees="0"
        >
        <shape
            android:innerRadiusRatio="2.3"
            android:shape="ring"
            android:angle="0"
            android:type="sweep"
            android:thicknessRatio="15.0">
            <gradient
                android:startColor="@color/color_5646F3"
                android:endColor="@color/color_ED88FE" />
        </shape>
    </rotate>
</item>
0赞 Keysi Jones 4/30/2021 #5

您可以访问进度条的可见性属性,并在需要它不可见时将其设置为不可见,如下所示

ProgressBar progressBar = view.findViewById<ProgressBar>(R.id.progressbar)

progressBar.visibility = ProgressBar.INVISIBLE