¿Barra de progreso con esquinas redondeadas?

82

Estoy tratando de lograr este diseño de barra de progreso: ingrese la descripción de la imagen aquí

El código actual que tengo produce esto: ingrese la descripción de la imagen aquí

Este es el código:

<item android:id="@android:id/background">
    <shape>
        <corners android:radius="8dp"/>
        <solid android:color="@color/dirtyWhite"/>
    </shape>
</item>

<item android:id="@android:id/progress">
    <clip>
        <shape>
            <corners android:radius="8dp"/>
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </clip>
</item>

Mi barra de progreso:

 <ProgressBar
            android:id="@+id/activeProgress"
            style="?android:attr/progressBarStyleHorizontal"
            android:layout_width="300dp"
            android:layout_height="wrap_content"
            android:layout_weight="1"
            android:progress="10"
            android:progressDrawable="@drawable/rounded_corners_progress_bar"/>

He intentado añadir <size>atributo en el <shape>de <cliphacer que el progreso a dar forma a un poco más pequeña, pero no funcionó. Además, la barra de progreso es plana y quiero que esté curvada según el diseño. ¿Qué necesito cambiar para lograr el diseño?

Georgi Koemdzhiev
fuente

Respuestas:

162

¿Cómo hacer que la forma de progreso sea un poco más pequeña?

Debe darle un poco de relleno al elemento de progreso, así:

<item android:id="@android:id/progress"
    android:top="2dp"
    android:bottom="2dp"
    android:left="2dp"
    android:right="2dp">

¿Cómo hacer que la barra de progreso se curve según el diseño?

Reemplace el <clip></clip>elemento con <scale android:scaleWidth="100%"></scale>. Eso hará que la forma mantenga su forma a medida que crece, y no se corta. Desafortunadamente, tendrá un pequeño efecto visual no deseado al principio, ya que las esquinas de las formas no tienen suficiente espacio para dibujar. Pero podría ser lo suficientemente bueno para la mayoría de los casos.

Código completo:

<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
 <item android:id="@android:id/background">
    <shape>
        <corners android:radius="8dp"/>
        <solid android:color="@color/dirtyWhite"/>
    </shape>
 </item>

 <item android:id="@android:id/progress"
    android:top="1dp"
    android:bottom="1dp"
    android:left="1dp"
    android:right="1dp">

    <scale android:scaleWidth="100%">
        <shape>
            <corners android:radius="8dp"/>
            <solid android:color="@color/colorPrimaryDark"/>
        </shape>
    </scale>
 </item>
</layer-list>
Eyal Biran
fuente
4
@habibullah El uso de ProgressBar y Layer-List nativos es muy restrictivo. Puede implementar fácilmente una barra de progreso personalizada que se adapte a sus necesidades. Por ejemplo, si tiene un fondo de color sólido, simplemente use una ruta de 9 en primer plano para ocultar todo menos el progreso. Si está apuntando a versiones de Android más nuevas, simplemente puede usar el soporte de máscara incorporado (no es compatible con versiones anteriores). Otra opción es usar una biblioteca, esto podría ser bueno para ti: github.com/akexorcist/Android-RoundCornerProgressBar . Si aún tiene problemas, publique una nueva pregunta. Salud.
Eyal Biran
1
@AkshayMahajan ver comentario arriba
Eyal Biran
1
Cuando apliqué su código completo, toda la barra de progreso se coloreó con mi color principal (colorPrimaryDark) aunque el progreso no es del 100%. Agregué la etiqueta de clip en @android: id / background, se corrigió, pero el fondo se ha ido. Mi solución temporal es eliminar el elemento de fondo y agregar color de fondo al diseño (sin esquinas redondeadas).
Oğuzhan Koşar
5
En mi caso, el scalecon android:scaleWidth="100%"hizo el truco para mostrarlo con esquinas redondeadas. Muchas gracias
Edison Spencer
1
Gracias. Salvaste mi día.
Nguyễn Anh Tuấn
8

Gracias a Georgi Koemdzhiev por una bonita pregunta e imágenes. Para aquellos que quieran hacer algo similar al suyo, haga lo siguiente.

1) Cree un fondo para un ProgressBar .

progress_bar_background.xml:

<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="rectangle"
    >
    <corners android:radius="3dp" />
    <stroke android:color="@color/white" android:width="1dp" />
</shape>

2) Cree una escala para el ProgressBar .

curved_progress_bar.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>
            <corners android:radius="2dp" />
            <solid android:color="@color/transparent" />
        </shape>
    </item>

    <item android:id="@android:id/progress">
        <clip>
            <shape>
                <corners android:radius="2dp" />
                <solid android:color="#ffff00" />
            </shape>
        </clip>
    </item>
</layer-list>

3) En el archivo de diseño, agregue el archivo ProgressBar.

<FrameLayout
    android:layout_width="match_parent"
    android:layout_height="6dp"
    android:layout_marginStart="20dp"
    android:layout_marginTop="10dp"
    android:layout_marginEnd="20dp"
    android:background="@drawable/progress_bar_background"
    >

    <ProgressBar
        android:id="@+id/progress_bar"
        style="@style/Widget.AppCompat.ProgressBar.Horizontal"
        android:layout_width="match_parent"
        android:layout_height="4dp"
        android:layout_margin="1dp"
        android:indeterminate="false"
        android:progressDrawable="@drawable/curved_progress_bar"
        />

</FrameLayout>
CoolMind
fuente
5

Con la biblioteca de componentes de materiales puede utilizar ProgressIndicatory el app:indicatorCornerRadiusatributo.
Algo como:

    <com.google.android.material.progressindicator.ProgressIndicator
        style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Indeterminate"
        app:indicatorSize="xxdp"
        app:indicatorCornerRadius="xdp"/>

ingrese la descripción de la imagen aquí

Funciona también para el indicador de progreso determinado ( style="@style/Widget.MaterialComponents.ProgressIndicator.Linear.Determinate").

Nota: requiere al menos la versión 1.3.0-alpha03.

Gabriele Mariotti
fuente
4

El código produce la siguiente barra de progreso.
Puede lograr una barra de progreso con color de progreso interno, color de borde, progreso vacío con color transparente.

<?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>
        <corners android:radius="15dip" />
        <stroke android:width="1dp" android:color="@color/black" />
    </shape>
</item>

<item android:id="@android:id/secondaryProgress">
    <clip>
        <shape>
            <corners android:radius="5dip" />
            <gradient
                android:startColor="@color/black"
                android:centerColor="@color/trans"
                android:centerY="0.75"
                android:endColor="@color/black"
                android:angle="270"

                />
        </shape>
    </clip>
 </item>


 <item
    android:id="@android:id/progress"
    >
    <clip>
        <shape>
            <corners
                android:radius="5dip" />
            <gradient
                android:startColor="@color/black"
                android:endColor="@color/black"
                android:angle="270" />
        </shape>
    </clip>
 </item>
 </layer-list>
Ravichandra SV
fuente
Hola Ravichandra, ¡gracias por tu respuesta! ¿Puede agregar una explicación de por qué su código responde a su pregunta? De lo contrario, será difícil de usar para otros usuarios. ¡Gracias!
Nander Speerstra
Gracias por este fragmento de código, que puede proporcionar ayuda inmediata y limitada. Una explicación adecuada mejoraría enormemente su valor a largo plazo al mostrar por qué es una buena solución al problema y lo haría más útil para futuros lectores con otras preguntas similares. Por favor, editar su respuesta a añadir un poco de explicación, incluyendo los supuestos realizados. Además, trate de explicar por qué su respuesta es mejor que las otras respuestas ya dadas a esta pregunta.
Qw3ry