Eliminar el relleno vertical de la barra de progreso horizontal


127

Por defecto, la barra de progreso tiene un cierto relleno encima y debajo de la barra. ¿Hay alguna forma de eliminar este relleno para tener la barra al final?


77
Como se señaló en otros temas, la configuración maxHeightno funciona.
abergmeier

android:minHeight="4dp"
Sam Chen

Respuestas:


71

Utilizo lo siguiente como solución para este problema.

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

1
No necesitaba layout_marginBottom.
AlikElzin-kilaka

11
android:layout_marginTop="-6dp"trabajó para mi. ¿Se pregunta si depende del dispositivo? Solo he probado en Xperia Z1
Thorbjørn Kappel Hansen

2
@ ThorbjørnKappelHansen Depende del dispositivo. Galaxy S6 y un margen superior de -6dp no funciona como se desea.
Muhammad Abdul-Rahim

1
Creo que los márgenes dependerán del tamaño de la barra de progreso y la versión de Android.
Noel

2
usando Framelayout(como en esta respuesta es una mejor solución y no depende del tamaño del teléfono / tipo / versión del sistema
operativo

57

Así es como usé la respuesta de Juozas:

La altura de mi ProgressBares 4dp. Así que creé un FrameLayoutcon altura 4dp y configuré el layout_gravityde ProgressBara center. Funciona como un encanto.

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

23
Esta es una buena idea, pero su código no funcionó para mí en Android 7.0 usando la barra de progreso de la biblioteca de soporte. La barra se volvió más delgada pero aún tenía relleno en la parte superior.
Sam

44
@Sam Simplemente haga ProgressBar, por ejemplo, altura = 100dp. Debido a FrameLayout, sigue siendo 4dp pero la barra se ve más gruesa.
Megaetron

55
No funciona en API 24+. La barra se adelgaza sin importar el tamaño que le demos.
Mauker

36

Terminé usando una biblioteca personalizada para resolver este problema. La mayoría de las otras soluciones funcionan, pero los resultados no son consistentes en varios dispositivos.

MaterialProgressBar

  • Apariencia consistente en Android 4.0+.
  • Corrección del tinte en las plataformas.
  • Capaz de eliminar el relleno intrínseco del marco ProgressBar.
  • Capaz de ocultar la pista del marco horizontal ProgressBar.
  • Se utiliza como reemplazo directo para el marco ProgressBar.

Para agregar como dependencia de gradle:

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

Para agregar una barra de progreso sin relleno intrínseco a su diseño:

<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"Hace el truco. Para más detalles ver la página de GitHub .


Primero intenté evitar agregar otra dependencia solo para eliminar algo de relleno. ¡Pero todas las otras soluciones fallaron de una u otra forma / versión y al final esto fue como 3 minutos para que funcione! Gracias.
ToniTornado

32
Una biblioteca completa solo para arreglar el relleno en una vista. Así se hace Google.
Denny

Es posible que desee utilizar @ estilo / Widget.AppCompat.ProgressBar.Horizontal de lo anterior (dependiendo de su configuración)
ROR

32

Si alguien aún necesita ayuda, puede intentar esto:

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

Aquí, la barra de progreso está dentro de ConstraintLayout , y los atributos restrictintTop_toTopOf y restrictintBottom_toTopOf deben aplicarse al mismo elemento (en este caso, es una guía).


55
¡Esto debe marcarse como la respuesta correcta, ya que funciona perfectamente!
Philio

1
¡Esta es la respuesta correcta! Es compatible con todos los dispositivos (que no se proporcionan con margen negativo) y las versiones de Android (que no se proporcionan con la solución de diseño de marcos). Además, no tiene que hacer todo el trabajo necesario importando los elementos dibujables del sistema a la aplicación (que no proporciona una interfaz de usuario coherente en todo el sistema para todas las versiones de Android).
Vaios

2
@Ali_Waris gracias por publicar una respuesta, estoy ansioso por entender esta solución porque no puedo hacer que funcione. ¿Podría ampliar la respuesta para incluir el diseño de restricción y la guía para la respuesta?
scottyab

¿Qué es la guía aquí? ¿A dónde irá?
iamgopal

en lugar de guidline, puede usar la vista vacía <Ver aplicación: layout_constraintStart_toStartOf = "parent" app: layout_constraintEnd_toEndOf = "parent" android: id = "@ + id / guideline" android: layout_width = "0dp" android: layout_height = "0dp" android : orientación = "vertical" android: visibilidad = aplicación "invisible": layout_constraintBottom_toBottomOf = "parent" />
Kochchy hace

16

Es posible dibujar ProgressBar centrado verticalmente dentro de un padre que recortaría el relleno. Como ProgressBar no puede dibujarse a sí mismo más grande que el padre, debemos crear un padre grande para colocarlo dentro de una vista de recorte.

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

1
Esto funcionó en Android 7.0, pero no resultó en una barra de progreso en mi Sony Xperia M con Android 4.1.2.
Sam

@ Sam gracias por informar! ¿Qué ves si cambias la altura del primer FrameLayout de 4dp a 48dp?
Juozas Kontvainis

Aparece la barra de progreso, pero tiene mucho relleno debajo y un poco de relleno encima.
Sam

@Sam He actualizado mi respuesta, espero que funcione de manera aceptable en su dispositivo Sony. Si no ayuda, sugiero revisar la configuración del tema de su aplicación. El uso del tema Holo en KitKat debería solucionarlo.
Juozas Kontvainis

15

Para eliminar el relleno vertical de ProgressBar, puede hacerlo por

  • arreglar la altura de ProgressBar
  • Use scaleY = "value" (value = height / 4) (4 es la altura predeterminada de la barra de progreso)

El ejemplo contiene 1 wrap_content ProgressBar, 1 8dp ProgressBar, 1 100dpProgressBar

ingrese la descripción de la imagen aquí

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

14

Una solución completa a este problema sería la siguiente. En caso de que alguien necesite fragmentos de código, esto es lo que hice.

  1. Copié los 8 dibujables de la barra de progreso horizontal indeterminada
  2. Editó los dibujables usando un manipulador de imágenes y eliminó rellenos innecesarios
  3. Copié el XML dibujable llamado progress_indeterminate_horizontal_holo.xml de la plataforma Android
  4. Copié el estilo Widget.ProgressBar.Horizontal y sus padres
  5. Establezca el estilo y min_height manualmente en el diseño

Aquí está el 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" />

Recursos de estilo copiados a mi archivo de estilos local.

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

Y finalmente, establezca la altura mínima en 4dp en mi archivo de diseño local.

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

¿Desde dónde podemos copiar el dibujo que se menciona en el paso 1: "1.Copié todos los 8 elementos de dibujo de la barra de progreso horizontal indeterminados"?
Greenhand

3
@JeffreyLin lo copié desde esta ubicación<your-sdk-folder>/platforms/android-17/data/res/drawable-hdpi/
Subin Sebastian

33
¿No es sorprendente cuánto trabajo tienes que hacer para lograr un comportamiento de sentido común que debería venir por defecto en Android?
SpaceMonkey

1
¿Y para el diseño de materiales?
mrroboaat

@aat No creo que las pautas materiales tengan barras de progreso similares. Revise este documento: google.com/design/spec/components/…
Subin Sebastian

10

Encontré el mismo problema al usar la barra de progreso con estilo horizontal.

La causa raíz es que el dibujo de 9 parches predeterminado para la barra de progreso: (progress_bg_holo_dark.9.png) tiene algunos píxeles transparentes verticales como relleno.

La solución final que funcionó para mí: personalizar el progreso dibujable, mi código de muestra de la siguiente manera:

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>

fragmento de diseño:

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

Esta es probablemente la mejor solución. Sin embargo, su código de ejemplo no produjo una barra de progreso en mi Sony Xperia M con Android 4.1.2.
Sam

8

Un truco es agregar márgenes negativos a su barra de progreso.

A continuación se muestra un ejemplo del código XML, suponiendo que esté en la parte superior de la pantalla:

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

resultado del código


Agregar márgenes negativos resolvió el problema para mí. ¡Gracias!
icarovirtual

5

La respuesta de Subin parece ser la única (actualmente) que no es un hack frágil sujeto a roturas en futuras versiones de Android ProgressBar.

Pero en lugar de pasar por la molestia de dividir los recursos, modificarlos y mantenerlos indefinidamente, he optado por utilizar la biblioteca MaterialProgressBar , que lo hace por nosotros:

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

En build.gradle:

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

Ese proyecto tiene una buena demostración que muestra las diferencias entre él y el ProgressBar incorporado.


4

si alguien sigue buscando una solución, revise este comentario

establecer la altura mínima en 4 dp

   android:minHeight="4dp"

-

  <ProgressBar
    android:id="@+id/web_view_progress_bar"
    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:indeterminate="false"
    android:max="100"
    android:min="0"
    android:progress="5"
    android:minHeight="4dp"
    android:progressTint="@color/vodafone_red"
    app:layout_constraintEnd_toEndOf="parent"
    app:layout_constraintStart_toStartOf="parent"
    app:layout_constraintTop_toTopOf="parent"
    tools:progress="60" />

Prefiero esta respuesta
Sam Chen

2

Yo uso minHeight y maxHeigh. Ayuda para diferentes versiones de 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" />

Necesita usar ambos. Api 23 funciona bien con

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

Pero las versiones inferiores de Api aumentan la altura de la barra de progreso a maxHeight en ese caso.


2

Intenta lo siguiente:

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

... y luego configure la barra de progreso según sus necesidades, ya que inicialmente mostrará una barra de tamaño medio con un tinte de progreso de color amarillo con un tinte de fondo de progreso grisáceo. Además, tenga en cuenta que no hay relleno vertical.


2

Úselo así, dentro de Linearlayout

 <LinearLayout
        android:layout_width="match_parent"
        android:background="#efefef"
        android:layout_height="wrap_content">

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

    </LinearLayout>

¡Funciona genial! La próxima vez describa qué hace el código y qué cambios hizo. ;-)
Desarrollador de Jokela

1

agregar el android: progressDrawable a una lista de capas definida en drawable solucionó el problema para mí. Funciona enmascarando la barra de progreso en un dibujo personalizado

implementación de ejemplo descrita en https://stackoverflow.com/a/4454450/1145905


1

Estoy usando style="@style/Widget.AppCompat.ProgressBar.Horizontal"y fue bastante fácil deshacerse de los márgenes. Ese estilo es:

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

Acabo de anular la altura mínima / máxima:

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

Nunca estuve satisfecho con la barra de progreso genérica y finalmente me dirigí a una biblioteca: me.zhanghai.android.materialprogressbar.MaterialProgressBar
Anthony

1

No es necesario descargar ningún módulo nuevo o incluso colocar un FrameLayout alrededor de su barra de progreso. Todos estos son solo hacks. Solo 2 pasos:

En tu whatever.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_horizontal.xml, cambie los valores como desee.

¿No te gustan las esquinas redondeadas?
Eliminar radio de esquina

¿No te gustan los colores? Cambiar los colores, etc. ¡Listo!

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

En general, estos son los pasos para cambiar el código de cualquier cosa que no le guste. Simplemente encuentre el código fuente y descubra qué cambiar. Si sigue el código fuente de ProgressBar, encontrará un archivo llamado progress_horizontal.xml al que hace referencia. Básicamente cómo resuelvo todos mis problemas XML.


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

0
<androidx.core.widget.ContentLoadingProgressBar
                    android:id="@+id/progressBar"
                    style="@style/Widget.AppCompat.ProgressBar.Horizontal"
                    android:layout_width="0dp"
                    android:layout_height="wrap_content"
                    android:indeterminate="true"
                    android:paddingTop="2dp"
                    app:layout_constraintTop_toTopOf="parent"
                    app:layout_constraintBottom_toTopOf="parent"
                    app:layout_constraintEnd_toEndOf="parent"
                    app:layout_constraintStart_toStartOf="parent"/>

Por favor, no simplemente publique el código. Dale un poco de contexto a tu respuesta.
Martin Gal

0

Simplemente haga uso de Material ProgressIndicator que no tiene margen oculto.

<com.google.android.material.progressindicator.ProgressIndicator
        android:id="@+id/progressBar"
        style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        app:indicatorColor="@color/colorPrimary"
        app:trackColor="@color/colorAccent" />

-1

Una solución simple sin trucos que es compatible con cualquier versión de Android y no necesita bibliotecas externas está fingiendo ProgressBarcon dos Viewsadentro LinearLayout. Esto es con lo que terminé. Parece bastante ordenado y este enfoque es bastante flexible: puede animarlo de manera original, agregar texto, etc.

Diseño:

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

Código:

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

}

Resultado (con alguna elevación añadida):

ingrese la descripción de la imagen aquí


-1

La mejor solución debería ser

android:minHeight="0dp"

Sin solución y funciona como un encanto.


no funcionó, ¿podría explicar por qué esto debería funcionar?
humble_wolf

@humble_wolf Funcionó para mí en mi proyecto anterior cuando escribí la respuesta; podría depender de alguna versión particular de la biblioteca? Debería funcionar porque la razón por la que existe un relleno similar a la barra de progreso no es el relleno real, pero hay un valor minHeightmayor que 0 (digamos 32dp tal vez) predefinido. Al cambiar esta propiedad, obtienes un aspecto diferente.
Alex Fan

No funcionó para mí en modo Inderminate = true, tal vez trabajando en modo determinado. Si realmente desea que esto sea una respuesta, escriba la explicación en respuesta con todas las condiciones.
hummble_wolf
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.