【问题标题】:How to create intermittent dynamic progress bar with steps in Android?如何在Android中创建带有步骤的间歇性动态进度条?
【发布时间】:2021-08-31 13:17:05
【问题描述】:

我想在 Android Studio 中创建一个动态的间歇性进度条(如下图所示),它会根据用户的选择改变其间隔。

这个想法是用户将选择他希望执行多少次行为,然后条将相应地分段。然后每次他们执行该行为时,该条都会为一个步长着色,如下图所示。

Intermittent Progress Bar

我正在寻找有关如何操作的一般指导,因为我是新手。

我想到了 3 种方法来做到这一点:

  1. 有大量的 png。每种情况的可绘制对象或向量,并在图像视图中相应地使用一个。 (对我来说似乎有点愚蠢)

  2. 创建与间隔一样多的视图,然后相应地更改视图颜色(在这种情况下,动态部分会出现问题,即间隔可变性)

  3. 以某种方式自定义水平 ProgressBar 以自动执行此操作。

我在网上搜索了对我来说最优雅的第三种方式,但找不到答案。

感谢您的宝贵时间。

【问题讨论】:

    标签: java android progress-bar android-progressbar intermittent


    【解决方案1】:

    使用当前的ProgressBar API 实际上很容易获得。

    根据所需的任务数量和完成的任务数量,您可以使用setMaxsetProgress 更新ProgressBar

    progressBar.setMax(totalTasks);
    progressBar.setProgress(tasksDone);
    

    这将覆盖进度条中的一小部分tasksDone / totalTasks


    编辑:根据 cmets 中突出显示的场景,您可以简单地在 LinearLayout 中使用多个视图。

    您可以使用带有所需分区颜色背景的 LinearLayout。

    <LinearLayout
        ....
        android:orientation="horizontal"
        android:background="@color/partition"
        ....
    />
    

    然后简单地以编程方式添加具有相等权重(和水平边距)的子视图:-

    for(task in tasks) {
        val progressBar = View(this)
        progressBar.marginEnd = gapRequired
        // customize your view here: Set background, shape etc.
    
        // Set the width to 0 and weight to 1f
        val params = LinearLayout.LayoutParams(0, height, 1f)
        linearLayout.addView(view, index, params)
    }
    

    稍后修改单个视图(进度条的片段):-

    val view = linearLayout.getChildAt(index)
    // Modify the view as needed
    

    从布局中删除视图:-

    linearLayout.removeViewAt(index)
    

    或者,如果您引用了视图:-

    linearLayout.removeView(view)
    

    您还可以使用linearLayout.removeAllViews()删除所有视图(如果您出于某种原因需要重置整个进度条)

    如果您希望progressBar 中有很多此类片段,您可能希望将RecyclerView 与适配器一起使用。

    【讨论】:

    • 我想把ProgressBar的分片画出来,让用户知道自己需要完成多少个分片。我上传了一张新图片,夸张地展示了我正在尝试做的事情(4 个任务,1 个以绿色完成,3 个剩余为灰色)。这是我还没有找到解决办法的说明性碎片。
    • @Theseus 为此,您可以尝试使用多个ProgressBars 或简单地使用带有LinearLayout 的矩形视图。您可以将 LinearLayout 背景设置为白色/浅灰色(用于指示分区),并在每个视图之间留出一点边距(例如 1dp)以显示分区(背景)。然后,每个视图都可以根据编号设置颜色。完成的任务数(第 1 个绿色/其他 3 个灰色)
    • @Theseus 我已根据您的要求更新了我的答案。 (如果它解决了问题,请接受这个答案)
    • @Yashovardhan99 谢谢你的回答。不幸的是,我不知道它是否能解决问题,因为我是编程新手,而且我使用的是 Java,而不是 Kotlin。我了解您实质上使用的是我在帖子中提到的第二种方式。我将尝试在 Java 中执行此操作,并在解决方案成功时做出响应。再次感谢您的努力。
    • @Theseus 应该与 Java 中的代码非常相似(大部分代码仍然相同)。再次阅读您的问题,这似乎是您建议的第二种方法。现在,除了构建/使用自定义视图来帮助解决此问题外,我想不出其他任何方法。即使您使用自定义视图,内部发生的事情的本质也会与此答案相似。
    猜你喜欢
    • 1970-01-01
    • 2020-05-16
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2017-06-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多