web-dev-qa-db-fra.com

Supprimer le rembourrage vertical de la barre de progression horizontale

Par défaut, la barre de progression possède un certain remplissage au-dessus et au-dessous de la barre. Existe-t-il un moyen de supprimer ce rembourrage pour ne conserver que la barre au final?

98
abergmeier

J'utilise ce qui suit comme solution de contournement pour ce problème.

Android:layout_marginBottom="-8dp"
Android:layout_marginTop="-4dp"
63
Stephen Wan

Voici comment j'ai utilisé la réponse de Juozas:

la hauteur de ma ProgressBar est de 4dp. J'ai donc créé une FrameLayout de hauteur 4dp et défini le layout_gravity de ProgressBar à center. Cela fonctionne comme un charme.

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

J'ai fini par utiliser une bibliothèque personnalisée pour résoudre ce problème. La plupart des autres solutions fonctionnent, mais les résultats ne sont pas cohérents sur différents périphériques.

MaterialProgressBar

  • Apparence cohérente sur Android 4.0+.
  • Teinter correctement sur toutes les plateformes.
  • Capable de supprimer le remplissage intrinsèque du framework ProgressBar.
  • Capable de cacher la piste du cadre horizontal ProgressBar.
  • Utilisé comme remplacement immédiat du framework ProgressBar.

Pour ajouter une dépendance de niveau:

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

Pour ajouter une barre de progression sans remplissage intrinsèque à votre présentation:

<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" fait le tour. Pour plus de détails, voir la page GitHub .

29
Binoy Babu

Une solution complète à ce problème serait la suivante. Juste au cas où quelqu'un aurait besoin de fragments de code, c'est ce que j'ai fait.

  1. Copié tous les 8 tirages indéfinis de la barre de progression horizontale
  2. Edité les dessinables à l'aide d'un manipulateur d'image et supprimer les bourrages inutiles
  3. Copié le XML dessinable nommé progress_indetermateate_horizontal_holo.xml depuis la plateforme Android
  4. Copié le style Widget.ProgressBar.Horizontal et ses parents
  5. Définir le style et min_height manuellement dans la présentation

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

Ressources de style copiées dans mon fichier de styles 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>

Et enfin, définissez min height sur 4dp dans mon fichier de présentation 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" />
13
Subin Sebastian

Il est possible de dessiner une barre de progression centrée verticalement à l'intérieur d'un parent qui découperait le rembourrage. Etant donné que ProgressBar ne peut pas se dessiner plus grand que le parent, nous devons créer un grand parent à placer dans une vue de découpage.

<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>
13
Juozas Kontvainis

La réponse de Subin semble être la seule (actuellement) qui ne soit pas un hack fragile susceptible de se briser dans les futures versions de l'Android ProgressBar.

Mais au lieu de prendre la peine d'exploiter les ressources, de les modifier et de les conserver indéfiniment, j'ai choisi d'utiliser la bibliothèque MaterialProgressBar , qui le fait pour nous:

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

Dans build.gradle:

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

Ce projet a une démo Nice qui montre les différences entre ce dernier et le ProgressBar intégré.

5
Stephen Talley

J'ai rencontré le même problème lorsque j'utilisais Progressbar avec le style Horizontal.

La cause fondamentale est que le correctif par défaut de 9 correctifs pour la barre de progression est le suivant:.

La solution finale qui a fonctionné pour moi: personnalisez les progrès dessinés, mon code exemple comme suit:

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>

extrait de mise en page:

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

J'utilise minHeight et maxHeigh. Cela aide pour différentes versions d'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" />

Il faut utiliser les deux. Api 23 fonctionne bien avec

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

Mais les versions inférieures d'API augmentent la hauteur de la barre de progression jusqu'à maxHeight dans ce cas.

2
Andrey Volynets

l'ajout d'Android: progressDrawable à une liste de couches définie dans drawable a résolu le problème pour moi. Cela fonctionne en masquant la barre de progression dans un dessin personnalisable

exemple d'implémentation décrit à https://stackoverflow.com/a/4454450/1145905

1
kip2

Essayez ce qui suit:

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

... et configurez ensuite la barre de progression en fonction de vos besoins, dans la mesure où elle affiche initialement une barre de taille moyenne avec une teinte de progression de couleur jaune avec une teinte de fond de progression grisâtre. Notez également qu'il n'y a pas de rembourrage vertical.

1
DaveNOTDavid

Pour supprimer le remplissage vertical de ProgressBar, vous pouvez le faire en

  • fixer la hauteur de ProgressBar
  • Utilisez scaleY = "valeur" (valeur = hauteur/4) (4 correspond à la hauteur par défaut de la barre de progression)

Exemple contenant 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" />
1
Linh

Essayez simplement les lignes de code ci-dessous dans votre mise en page 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" />

 enter image description here

1
chinmay.d

J'utilise style="@style/Widget.AppCompat.ProgressBar.Horizontal" et il était assez facile de se débarrasser des marges. Ce style est:

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

Je viens de surcharger la hauteur min/max:

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

Si quelqu'un a encore besoin d'aide, essayez ceci:

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

Ici, la barre de progression se trouve dans les attributs ConstraintLayout , et les attributs constraintTop_toTopOf et constraintBottom_toTopOf doivent être appliqués au même élément (dans ce cas, il s'agit d'une directive).

1
Ali_Waris

La meilleure solution devrait être

Android:minHeight="0dp"

Aucune solution de contournement et fonctionne comme un charme.

0
Alex Fan
 <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
mallem mahesh

Il n'est pas nécessaire de télécharger un nouveau module ou même de placer un FrameLayout autour de votre barre de progression. Ce ne sont que des bidouilles. Seulement 2 étapes:

Dans votre quel que soit.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, modifiez les valeurs à votre guise.

Vous n'aimez pas les coins arrondis?
Supprimer le rayon de coin

Vous n'aimez pas les couleurs? Changer les couleurs, etc. Fait!

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

Généralement, ce sont les étapes pour changer le code de tout ce que vous n'aimez pas. Trouvez simplement le code source et déterminez ce qu'il faut changer. Si vous suivez le code source de ProgressBar, vous trouverez un fichier appelé progress_horizontal.xml auquel il fait référence. Fondamentalement, comment je résous tous mes problèmes XML.

0
Daniel Kim