删除水平进度条中的内边距

在我们的应用程序中,我们需要一个不确定的进度条,如下所示:

progress bar how it should be

我们可以通过在进度条上设置负边距来实现此目的,如下所示:

<ProgressBar
    android:id="@+id/progressbar"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    android:marginTop="-7dp"
    android:visibility="@{loading ? View.VISIBLE : View.GONE}" />

但是,由于 ConstraintLayout 不支持负边距,因此它看起来像这样:

progress bar with padding

好吧,负边距是一个黑客攻击。让我们用不同的黑客来代替它,好吗?让我们介绍一下我们的 自定义视图 ,它扩展并覆盖其方法,如下所示:CustomProgressBarProgressBaronDraw

@Override
protected void onDraw(Canvas canvas) {
    int marginTop = dpToPx(7);
    canvas.translate(0, -marginTop);
    super.onDraw(canvas);
}

但所有这些都闻起来像是糟糕的代码。必须有更好的解决方案!你会推荐什么?


答案 1

感觉不太像黑客的解决方案:将巨大的包裹在较小的.这样,限制其高度,但仍然完整显示。ProgressBarFrameLayoutFrameLayoutProgressBar

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="4dp">

    <ProgressBar
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="32dp"
        android:layout_gravity="center" />

</FrameLayout>

答案 2

执行此操作的另一种方法是使用指南,并在父顶部和指南之间居中显示进度条。

<ProgressBar
    android:id="@+id/progressBar2"
    style="?android:attr/progressBarStyleHorizontal"
    android:layout_width="0dp"
    android:paddingTop="-4dp"
    android:layout_height="wrap_content"
    app:layout_constraintRight_toRightOf="parent"
    app:layout_constraintLeft_toLeftOf="parent"
    app:layout_constraintBottom_toTopOf="@+id/guideline"
    app:layout_constraintTop_toTopOf="parent" />

<android.support.constraint.Guideline
    android:layout_width="wrap_content"
    android:layout_height="wrap_content"
    android:id="@+id/guideline"
    android:orientation="horizontal"
    app:layout_constraintGuide_begin="4dp" />