Удалите прокладку в горизонтальном индикаторе выполнения

В нашем приложении нам нужен неопределенный индикатор выполнения, например:

индикатор выполнения, как это должно быть

Мы можем достичь этого, установив отрицательный запас на ProgressBar, например:

<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 не поддерживает отрицательные поля, он будет выглядеть следующим образом:

индикатор выполнения с дополнением

ОК, отрицательный запас был взломан. Позвольте заменить его другим взломом, не так ли? Представьте наш пользовательский вид CustomProgressBar, который расширяет ProgressBar и переопределяет его метод onDraw, например:

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

Но все это пахнет плохим кодом. Должно быть лучшее решение! Что бы вы порекомендовали?

Ответ 1

Другой способ сделать это - использовать Guideline и центр ProgressBar между родительским верхом и директивой.

<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" />

Ответ 2

Решение, которое меньше похоже на взлома: оберните огромный ProgressBar меньшим FrameLayout. Таким образом, FrameLayout ограничивает его высоту, но ProgressBar все еще отображается полностью.

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

Ответ 3

Я столкнулся с той же проблемой. И, как вы сказали, я сталкиваюсь с многочисленными решениями, которые кажутся взломом, которые могут сломать что-то еще по линии. С учетом сказанного я встретил одно решение, которое должно использовать эту библиотеку вместо этого для индикатора выполнения.

Следует отметить, что он должен проинтегрировать его, добавив:

compile 'me.zhanghai.android.materialprogressbar:library:1.3.0'

Однако, когда я использовал это, он дал мне ошибку в библиотеке поддержки Android для плавающей панели действий. Поэтому я рекомендую вам использовать это вместо:

compile 'me.zhanghai.android.materialprogressbar:library:1.1.7'

Пример фрагмента кода о том, как я его использовал:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:id="@+id/reviewProgressBar"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="6dp"
    android:layout_below="@+id/my_toolbar"
    android:indeterminate="false"
    app:mpb_progressStyle="horizontal"
    app:mpb_useIntrinsicPadding="false"/>

Надеюсь, это поможет!

Ответ 4

Обходной путь, который я сделал, - это установить высоту ProgressBar близко к ширине такта:

Индикатор выполнения:

<ProgressBar
    android:id="@+id/pb_loading_progress"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="2.1dp"
    android:layout_below="@id/tb_browser"
    android:max="100"
    android:progressDrawable="@drawable/style_browser_progress_drawable"
    android:visibility="invisible" />

Достижимый прогресс:

<?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:shape="line">
            <stroke
                android:width="2dp"
                android:color="@color/colorPrimary" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip
            android:clipOrientation="horizontal"
            android:gravity="left">
            <shape android:shape="line">
                <stroke
                    android:width="2dp"
                    android:color="@color/white" />
            </shape>
        </clip>
    </item>
</layer-list>

Это выглядело так:

введите описание изображения здесь