【问题标题】:Adding vertical line to ProgressBar将垂直线添加到 ProgressBar
【发布时间】:2020-09-28 01:02:08
【问题描述】:

我有一个 ProgressBar,效果很好。我使用了以下布局:

<ProgressBar style="?android:attr/progressBarStyleHorizontal"
    android:id="@+id/scoreboard_rank_progress_bar"
    android:layout_width="match_parent"
    android:layout_height="20dp"
    android:layout_marginTop="6dp"
    android:indeterminate="false"
    android:layout_gravity="center_horizontal"
    android:progressDrawable="@drawable/progress_bar" />

现在,我想添加红色垂直线,例如在条形图的 25% 和 65% 处(从左至右)。我找到了以下approach

Paint linePaint = new Paint();
linePaint.setColor(getResources().getColor(android.R.color.black));
final float lineWidth = 5f;
linePaint.setStrokeWidth(lineWidth);
canvas.drawLine(getWidth() * m100 / 100, 0, 
                getWidth() * m100 / 100, getHeight(), 
                linePaint);

不幸的是,这不起作用,因为我正在使用 Activity 并且无法访问画布。我还能如何添加垂直线?理想情况下,我想在代码中执行此操作,以便我可以在运行时更改它,但如果只能在布局中进行,我也会这样做。

【问题讨论】:

标签: android android-layout charts android-drawable android-progressbar


【解决方案1】:

您需要扩展ProgressBar 类并覆盖onDraw() 方法,该方法将为您提供一个可以在其上绘制的画布。然后你可以做你的绘画逻辑,例如:

class MyProgressBar extends ProgressBar {
    ...

    @Override
    public void onDraw(Canvas canvas) {
        Paint linePaint = new Paint();
        linePaint.setColor(getResources().getColor(android.R.color.black));
        final float lineWidth = 5f;
        linePaint.setStrokeWidth(lineWidth);
        canvas.drawLine(getWidth() * m100 / 100, 0, 
                getWidth() * m100 / 100, getHeight(), 
                linePaint);
    }
}

最后,将添加到 XML 文件中的 ProgressBar 替换为您的自定义 MyProgressBar

其他改进:将绘制初始化移到 draw 方法之外,这样您就不会在每次 onDraw() 调用时重新初始化同一个对象。对lineWidth 执行相同操作。

【讨论】:

  • 非常感谢。我希望我的自定义进度条与添加到我的 XML 文件中的 ProgressBar 具有完全相同的外观。你知道 MyProgressBar 类应该是什么样子,这样它就完全一样(除了 onDraw 方法)吗?
  • 只需在具有相同属性的 XML 中使用您的自定义进度条。因此,您将在 XML 中使用