Подтвердить что ты не робот

Снять вертикальную прокладку с горизонтальной панели ProgressBar

По умолчанию ProgressBar имеет определенное дополнение над и под панелью. Есть ли способ удалить это дополнение, чтобы в конце концов иметь только панель?

4b9b3361

Ответ 1

В качестве обходного пути для этой проблемы я использую следующее.

android:layout_marginBottom="-8dp"
android:layout_marginTop="-4dp"

Ответ 2

Вот как я использовал Juozas:

высота моего ProgressBar равна 4dp. Поэтому я создал FrameLayout с высотой 4dp и установил layout_gravity от ProgressBar до center. Он работает как шарм.

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

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

</FrameLayout>

Ответ 3

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

MaterialProgressBar

  • Совлокальный внешний вид на Android 4.0 +.
  • Корректировка цвета между платформами.
  • Возможность удалить внутреннее дополнение рамки ProgressBar.
  • Возможность скрывать трассу рамки горизонтального ProgressBar.
  • Используется как замена для рамки ProgressBar.

Чтобы добавить как зависимость gradle:

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

Чтобы добавить ProgressBar без встроенного дополнения к вашему макету:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:layout_width="wrap_content"
    android:layout_height="4dp"
    android:indeterminate="true"
    app:mpb_progressStyle="horizontal"
    app:mpb_useIntrinsicPadding="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal" />

app:mpb_useIntrinsicPadding="false" делает трюк. Подробнее см. на странице GitHub.

Ответ 4

Можно создать вертикально центрированный ProgressBar внутри родителя, который будет отжимать отступ. Поскольку ProgressBar не может сделать себя более крупным, чем родительский, мы должны создать большой родительский объект для размещения внутри обрезающего представления.

<FrameLayout
    android:id="@+id/clippedProgressBar"
    xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    tools:ignore="UselessParent">

    <FrameLayout
        android:layout_width="match_parent"
        android:layout_height="16dp"
        android:layout_gravity="center_vertical">

        <ProgressBar
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="match_parent"
            android:layout_height="match_parent"
            android:indeterminate="true"/>

    </FrameLayout>

</FrameLayout>

Ответ 5

Полное решение этой проблемы было бы следующим. На всякий случай, если кому-то нужны фрагменты кода, это то, что я сделал.

  • Скопировано все 8 неопределенных горизонтальных индикаторов прогресса выполнения
  • Отредактируйте чертежи с помощью некоторого манипулятора изображения и удалите ненужные прокладки
  • Скопировал выталкиваемый XML с именем progress_indeterminate_horizontal_holo.xml с платформы Android.
  • Скопирован стиль Widget.ProgressBar.Horizontal и его родители.
  • Установите стиль и min_height вручную в макете

Здесь находится progress_indeterminate_horizontal_holo.xml

<animation-list
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:oneshot="false">
<item android:drawable="@drawable/progressbar_indeterminate_holo1" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo2" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo3" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo4" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo5" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo6" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo7" android:duration="50" />
<item android:drawable="@drawable/progressbar_indeterminate_holo8" android:duration="50" />

Ресурсы стиля скопированы в мой файл локальных стилей.

<style name="Widget">
    <item name="android:textAppearance">@android:attr/textAppearance</item>
</style>

<style name="Widget.ProgressBar">
    <item name="android:indeterminateOnly">true</item>
    <item name="android:indeterminateBehavior">repeat</item>
    <item name="android:indeterminateDuration">3500</item>
</style>

<style name="Widget.ProgressBar.Horizontal">
    <item name="android:indeterminateOnly">false</item>
    <item name="android:indeterminateDrawable">@drawable/progress_indeterminate_horizontal_holo</item>
</style>

И, наконец, установите минимальную высоту в 4dp в моем локальном файле макета.

<ProgressBar
    android:id="@+id/pb_loading"
    style="@style/Widget.ProgressBar.Horizontal"
    android:layout_width="fill_parent"
    android:layout_height="wrap_content"
    android:layout_centerHorizontal="true"
    android:layout_centerVertical="true"
    android:indeterminate="true"
    android:minHeight="4dp"
    android:minWidth="48dp"
    android:progressDrawable="@drawable/progress_indeterminate_horizontal_holo" />

Ответ 6

Если кому-то все еще нужна помощь, можете попробовать это:

<androidx.core.widget.ContentLoadingProgressBar
                android:id="@+id/progress"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                app:layout_constraintEnd_toEndOf="parent"
                app:layout_constraintTop_toTopOf="@+id/guideline" android:indeterminate="true"
                android:visibility="visible" app:layout_constraintBottom_toTopOf="@+id/guideline"/>

Здесь индикатор выполнения находится внутри ConstraintLayout, а атрибуты constraintTop_toTopOf и constraintBottom_toTopOf должны применяться к одному и тому же элементу (в данном случае это указание).

Ответ 7

Ответ Subin, кажется, единственный (в настоящее время), который не является хрупким взломом, подверженным поломке в будущих версиях Android ProgressBar.

Но вместо того, чтобы разбираться с ресурсами, изменять их и поддерживать их в течение неопределенного времени, я решил использовать библиотеку MaterialProgressBar, которая делает это для нас:

<me.zhanghai.android.materialprogressbar.MaterialProgressBar
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="true"
    android:layout_gravity="bottom"
    custom:mpb_progressStyle="horizontal"
    custom:mpb_showTrack="false"
    custom:mpb_useIntrinsicPadding="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal.NoPadding"
/>

В build.gradle:

// Android horizontal ProgressBar doesn't allow removal of top/bottom padding
compile 'me.zhanghai.android.materialprogressbar:library:1.1.6'

У этого проекта есть хорошая демонстрация, которая показывает различия между ним и встроенным ProgressBar.

Ответ 8

Я встретил ту же проблему при использовании progressbar с горизонтальным стилем.

Основная причина заключается в том, что 9-патч по умолчанию для строки выполнения: (progress_bg_holo_dark.9.png) имеет несколько вертикальных прозрачных пикселей в качестве отступов.

Окончательное решение, которое сработало для меня: настройте достигнутый прогресс, мой пример кода:

custom_horizontal_progressbar_drawable.xml

<?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="rectangle">
            <solid android:color="#33ffffff" />
        </shape>
    </item>
    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#ff9800" />
            </shape>
        </clip>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle">
                <solid android:color="#E91E63" />
            </shape>
        </clip>
    </item>
</layer-list>

макет фрагмента:

<ProgressBar
    android:id="@+id/song_progress_normal"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="5dp"
    android:layout_alignParentBottom="true"
    android:progressDrawable="@drawable/custom_horizontal_progressbar_drawable"
    android:progress="0"/>

Ответ 9

Одна хитрость заключается в добавлении отрицательных полей в ваш индикатор выполнения.

Ниже приведен пример кода XML, предполагая его в верхней части экрана:

<ProgressBar
    android:id="@+id/progressBar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:layout_marginTop="-7dp"
    android:layout_marginBottom="-7dp"
    android:indeterminate="true" />

result of code

Ответ 10

Я использую minHeight и maxHeigh. Это помогает для разных версий Api.

<ProgressBar
    android:id="@+id/progress_bar"
    style="@style/Base.Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:maxHeight="3dp"
    android:minHeight="3dp" />

Он должен использовать оба. Api 23 работает хорошо с

android:layout_height="wrap_content"
android:minHeight="0dp"

Но более низкие версии Api в этом случае увеличивают высоту шага выполнения до maxHeight.

Ответ 11

Чтобы удалить вертикальное заполнение ProgressBar, вы можете сделать:

  • исправить высоту ProgressBar
  • Используйте scaleY = "value" (value = height/4) (4 - высота индикатора выполнения по умолчанию)

Пример содержит 1 wrap_content ProgressBar, 1 8dp ProgressBar, 1 100dp ProgressBar

enter image description here

<ProgressBar
    style="?android:attr/progressBarStyleHorizontal"
    ...
    android:layout_height="8dp"
    android:scaleY="2" />

Ответ 12

добавление android: progressDrawable в список слоев, определенный в drawable, исправил проблему для меня. Он работает, маскируя панель progess в пользовательских возможностях

пример реализации описан в fooobar.com/questions/52705/...

Ответ 13

Я использую style="@style/Widget.AppCompat.ProgressBar.Horizontal", и было довольно легко избавиться от полей. Этот стиль:

    <item name="progressDrawable">@drawable/progress_horizontal_material</item>
    <item name="indeterminateDrawable">@drawable/progress_indeterminate_horizontal_material</item>
    <item name="minHeight">16dip</item>
    <item name="maxHeight">16dip</item>

Я просто перевернул минимальную/максимальную высоту:

    <ProgressBar
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="2dp"
        android:indeterminate="true"
        android:minHeight="2dp"
        android:maxHeight="2dp" />

Ответ 14

Попробуйте следующее:

<ProgressBar
    android:id="@+id/progress_bar"
    style="@android:style/Widget.ProgressBar.Horizontal"
    android:progress="25"
    android:progressTint="@color/colorWhite"
    android:progressBackgroundTint="@color/colorPrimaryLight"
    android:layout_width="match_parent"
    android:layout_height="4dp" />

... и затем настройте индикатор выполнения для ваших нужд, так как вначале отобразится панель среднего размера с желтым цветом с оттенком серого цвета. Также обратите внимание, что нет вертикальной прокладки.

Ответ 15

 <ProgressBar
        android:layout_marginTop="-8dp"
        android:layout_marginLeft="-8dp"
        android:layout_marginRight="-8dp"
        android:id="@+id/progress_bar"
        style="?android:attr/progressBarStyleHorizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:indeterminate="false"
        android:indeterminateTint="@color/white"
        android:max="100"
        android:paddingStart="8dp"
        android:paddingRight="0dp"
        android:progressDrawable="@drawable/progress_bg" />

Ответ 16

Нет необходимости загружать какой-либо новый модуль или даже размещать FrameLayout вокруг вашего индикатора выполнения. Это все просто хаки. Всего 2 шага:

В вашем what.xml

<ProgressBar
    android:id="@+id/workoutSessionGlobalProgress"
    android:layout_width="match_parent"
    android:layout_height="YOUR_HEIGHT"
    android:progressDrawable="@drawable/progress_horizontal"
    android:progress="0"
    <!-- High value to make ValueAnimator smoother -->
    android:max="DURATION * 1000"
    android:indeterminate="false"
    style="@style/Widget.MaterialProgressBar.ProgressBar.Horizontal"/>

progress_horizont.xml, измените значения, как вам угодно.

Не любите закругленные углы?
Удалить радиус угла

Не любите цвета? Изменить цвета и т.д. Готово!

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:id="@android:id/background">
        <shape>
            <corners android:radius="5dip" />
            <gradient
                    android:startColor="#ff9d9e9d"
                    android:centerColor="#ff5a5d5a"
                    android:centerY="0.75"
                    android:endColor="#ff747674"
                    android:angle="270"
                    />
        </shape>
    </item>

    <item android:id="@android:id/secondaryProgress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#80ffd300"
                        android:centerColor="#80ffb600"
                        android:centerY="0.75"
                        android:endColor="#a0ffcb00"
                        android:angle="270"
                        />
            </shape>
        </clip>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="5dip" />
                <gradient
                        android:startColor="#ffffd300"
                        android:centerColor="#ffffb600"
                        android:centerY="0.75"
                        android:endColor="#ffffcb00"
                        android:angle="270"
                        />
            </shape>
        </clip>
    </item>

</layer-list>

Как правило, это шаги для изменения кода того, что вам не нравится. Просто найдите исходный код и выясните, что нужно изменить. Если вы будете следовать исходному коду ProgressBar, вы найдете файл с именем progress_horizont.xml, на который он ссылается. В основном, как я решаю все свои проблемы с XML.

Ответ 17

Лучшее решение должно быть

android:minHeight="0dp"

Нет обходного пути и работает как шарм.

Ответ 18

Простое решение без трюков, совместимое с любой версией Android и не нуждающееся в внешних библиотеках, фальсифицирует ProgressBar двумя Views внутри LinearLayout. Это то, чем я закончил. Выглядит довольно аккуратно, и этот подход довольно гибкий - вы можете оживить его с помощью фанковых способов, добавить текст и т.д.

Разметка:

<LinearLayout
    android:id="@+id/inventory_progress_layout"
    android:layout_width="match_parent"
    android:layout_height="4dp"
    android:orientation="horizontal">

    <TextView
        android:id="@+id/inventory_progress_value"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />

    <TextView
        android:id="@+id/inventory_progress_remaining"
        android:layout_width="match_parent"
        android:layout_height="match_parent" />
</LinearLayout>

код:

public void setProgressValue(float percentage) {
    TextView progressValue = (TextView) findViewById(R.id.inventory_progress_value);
    TextView progressRemaining = (TextView) findViewById(R.id.inventory_progress_remaining);

    LinearLayout.LayoutParams paramsValue = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);
    LinearLayout.LayoutParams paramsRemaining = new LinearLayout.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT);

    paramsValue.weight = (100 - percentage);
    paramsRemaining.weight = percentage;

    progressValue.setLayoutParams(paramsValue);
    progressRemaining.setLayoutParams(paramsRemaining);

}

Результат (с добавлением некоторой отметки):

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