Удалить вертикальную прокладку из горизонтального ProgressBar

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

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

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

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

Высота моего ProgressBar равна 4dp. Поэтому я создал FrameLayout с высотой 4dp и установил layout_gravity of 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> 

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

MaterialProgressBar

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

Чтобы добавить как зависимость градиента:

 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 .

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

  1. Скопированы все 8 неопределенных горизонтальных индикаторов прогресса выполнения
  2. Отредактировал чертежи с помощью некоторого манипулятора изображения и удалил ненужные прокладки
  3. Скопировал выталкиваемый XML с именем progress_indeterminate_horizontal_holo.xml с платформы Android
  4. Скопирован стиль Widget.ProgressBar.Horizontal и его родители
  5. Установите стиль и 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" /> 

Можно рисовать вертикально центрированный 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="48dp" 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> 

Ответ 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.

Я встретил ту же проблему при использовании 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"/> 

Я использую 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 в этом случае.

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

Пример реализации описан на https://stackoverflow.com/a/4454450/1145905

Я использую 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" /> 

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

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

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