【问题标题】:How to make ProgressBar stop spinning?如何让 ProgressBar 停止旋转?
【发布时间】:2012-10-16 17:38:41
【问题描述】:

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

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

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

换句话说,如何使圆形 ProgressBar 表现得像水平 ProgressBar,除了形状?

【问题讨论】:

  • 圆形进度条被称为“不确定”是有原因的。您可能需要创建某种自定义可绘制对象。
  • 我将indeterminate 设置为假。但是,不管我设置什么,图像都没有改变,progressmax 是干什么用的?
  • ProgressBar 应该是使用indeterminate 时的实际条形图。就像您在 Google Drive 上下载文件一样。我们可以看看你正在使用的代码吗?
  • @Eric,没有代码,我拖放了圆形 ProgressBar,但无论我如何配置它,它都只是旋转。 IE。 maxprogress 值被完全忽略。

标签: android android-progressbar


【解决方案1】:

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

这实际上比你想象的要容易,你必须在你的可绘制文件夹内的一个 xml 文件中设置一个自定义进度,并处理 标签中的“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,则进度将从圆圈的右侧开始。

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

【讨论】:

    【解决方案2】:

    由于Api 21 你可以这样做:假设你的ProgressBar 是这样定义的:

     <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);
                }
            }
    

    【讨论】:

    • 感谢您提供此解决方案,它对我来说非常有效。如果你愿意,你会如何重新开始旋转?
    • 我意识到该怎么做,这段代码正在做的是从 0 度旋转到 0 度(看起来停止了),所以要重置动画旋转只需返回到 rotateDrawable.setToDegrees(360);这应该有效。我为任何寻找此答案的人添加了评论。
    • 很棒的朋友!如果可以,我可以将其添加到问题中。
    • 似乎我做错了什么,因为在将可绘制对象转换为 RotateDrawble 时出现类异常。我以编程方式添加了进度条 progressBar = new ProgressBar(getContext()); progressBar.setMax(maxDurationInMilliSec / 1000);进度条.setProgress(0); progressBar.setIndeterminate(true); progressBar.setIndeterminateDrawable(getContext().getDrawable(R.drawable.circle_loader));
    • 如果你没有像我在答案中写的那样在xml中设置android:indeterminateDrawable,你就不能像这样在这段代码中使用。
    【解决方案3】:

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

    【讨论】:

    • 谢谢。奇怪的是,首先发布了这样的错误代码(ProgressBar)。
    • 没有问题,但它并不是真正的错误。它完全符合它的设计目的。当您不知道某件事需要多长时间时,可以使用圆形。 Android UI 始终使用 bar-type 来表示“完成百分比”,并使用 circular 表示“正在进行的工作”,以便用户理解它们各自的含义。
    • 好的,但是“进行中的工作”不需要这些属性。它打开或关闭。添加死属性是设计缺陷(或错误)。
    【解决方案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" />
    

    用于将drawable添加到上面的进度条

     <?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>
    

    【讨论】:

      【解决方案5】:

      您可以访问进度条的可见性属性,并在需要时将其设置为不可见,像这样不可见

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2012-05-31
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2012-07-04
        • 2017-11-05
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多