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?
J'utilise ce qui suit comme solution de contournement pour ce problème.
Android:layout_marginBottom="-8dp"
Android:layout_marginTop="-4dp"
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>
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 .
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.
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" />
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>
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é.
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"/>
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.
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
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.
Pour supprimer le remplissage vertical de ProgressBar
, vous pouvez le faire en
ProgressBar
Exemple contenant 1 wrap_content ProgressBar
, 1 8dp ProgressBar
, 1 100dp ProgressBar
<ProgressBar
style="?android:attr/progressBarStyleHorizontal"
...
Android:layout_height="8dp"
Android:scaleY="2" />
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" />
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" />
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).
La meilleure solution devrait être
Android:minHeight="0dp"
Aucune solution de contournement et fonctionne comme un charme.
<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" />
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.