Androïde-style seek bar

j'ai voulu styliser une barre de recherche qui ressemble à celle de l'image ci-dessous.

enter image description here

en utilisant par défaut seekbar je vais obtenir quelque chose comme ceci:

enter image description here

donc ce dont j'ai besoin c'est seulement de changer la couleur. Je n'ai pas besoin de styles supplémentaires. Y a-t-il une approche simple pour le faire ou dois-je construire mon tiroir sur mesure.?

I j'ai essayé de construire sur mesure un, mais je n'ai pas pu obtenir l'exacte comme indiqué ci-dessus. Après avoir utilisé custom drawable, ce que j'obtiens est comme suit:

enter image description here

si j'ai besoin de construire le personnalisé, alors s'il vous plaît suggérer comment réduire la largeur de la ligne de progression et aussi la forme.

ma mise en œuvre personnalisée:

background_fill.xml:

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <gradient
        android:angle="90"
        android:centerColor="#FF555555"
        android:endColor="#FF555555"
        android:startColor="#FF555555" />

    <corners android:radius="1dp" />

    <stroke
        android:width="1dp"
        android:color="#50999999" />
    <stroke
        android:width="1dp"
        android:color="#70555555" />

</shape>

progess_fill.XML

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android" >

    <gradient
        android:angle="90"
        android:centerColor="#FFB80000"
        android:endColor="#FFFF4400"
        android:startColor="#FF470000" />

    <corners android:radius="1dp" />

    <stroke
        android:width="1dp"
        android:color="#50999999" />
    <stroke
        android:width="1dp"
        android:color="#70555555" />

</shape>

progrès.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"
        android:drawable="@drawable/background_fill"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/progress_fill" />
    </item>

</layer-list>

pouce.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval" >

    <gradient
        android:angle="270"
        android:endColor="#E5492A"
        android:startColor="#E5492A" />

    <size
        android:height="20dp"
        android:width="20dp" />

</shape>

seekbar:

<SeekBar
        android:id="@+id/seekBarDistance"
        android:layout_width="match_parent"
        android:layout_height="wrap_content"
        android:layout_alignParentLeft="true"
        android:layout_alignParentTop="true"
        android:layout_marginTop="88dp"
        android:progressDrawable="@drawable/progress"
        android:thumb="@drawable/thumb" >
    </SeekBar>
196
demandé sur suresh cheemalamudi 2013-04-23 11:16:49

20 réponses

je voudrais extraire des tirables et xml à partir du code source Android et changer sa couleur en rouge. Voici un exemple de ce que j'ai fait pour les tirages mdpi:

sur mesure red_scrubber_control.xml (ajouter à la réserve/ tirant):

<selector xmlns:android="http://schemas.android.com/apk/res/android">

    <item android:drawable="@drawable/red_scrubber_control_disabled_holo" android:state_enabled="false"/>
    <item android:drawable="@drawable/red_scrubber_control_pressed_holo" android:state_pressed="true"/>
    <item android:drawable="@drawable/red_scrubber_control_focused_holo" android:state_selected="true"/>
    <item android:drawable="@drawable/red_scrubber_control_normal_holo"/>
</selector>

coutume: red_scrubber_progress.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/red_scrubber_track_holo_light"/>
    <item android:id="@android:id/secondaryProgress">
        <scale
            android:drawable="@drawable/red_scrubber_secondary_holo"
            android:scaleWidth="100%" />
    </item>
    <item android:id="@android:id/progress">
        <scale
            android:drawable="@drawable/red_scrubber_primary_holo"
            android:scaleWidth="100%" />
    </item>

</layer-list>

puis copier les tirables requis à partir du code source Android, j'ai pris à partir de ce lien

Il est bon de copier ces drawables pour chaque hdpi, mdpi, xhdpi. Par exemple, j'utilise uniquement mdpi:

alors en utilisant Photoshop changer la couleur du bleu au rouge:

red_scrubber_control_disabled_holo.png: red_scrubber_control_disabled_holo

red_scrubber_control_focused_holo.png: red_scrubber_control_focused_holo

red_scrubber_control_normal_holo.png: red_scrubber_control_normal_holo

red_scrubber_control_pressed_holo.png: red_scrubber_control_pressed_holo

red_scrubber_primary_holo.9.png: red_scrubber_primary_holo.9

red_scrubber_secondaire_holo.9.png: red_scrubber_secondary_holo.9

red_scrubber_track_holo_light.9.png: red_scrubber_track_holo_light.9

ajouter SeekBar à la disposition:

<SeekBar
    android:id="@+id/seekBar1"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressDrawable="@drawable/red_scrubber_progress"
    android:thumb="@drawable/red_scrubber_control" />

résultat:

enter image description here

280
répondu andrew 2018-03-20 19:52:59

si vous voulez exactement la même barre mais en rouge, vous pouvez ajouter un filtre couleur PorterDuff programatically. Vous pouvez obtenir chaque dessin que vous voulez coloriser par les méthodes de la ProgressBar classe de base. Puis définissez un filtre couleur pour lui.

mySeekBar.getProgressDrawable().setColorFilter(new PorterDuffColorFilter(srcColor, PorterDuff.Mode.MULTIPLY));

si le réglage de couleur souhaité ne peut pas être fait à travers un filtre de Porter Duff, vous pouvez spécifier votre propre filtre de couleur .

55
répondu Andras Balázs Lajtha 2017-05-23 12:02:45

ma réponse est inspirée de la réponse D'Andras Balázs Lajtha il permet de travailler sans fichier xml

seekBar.getProgressDrawable().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
seekBar.getThumb().setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);
52
répondu fred dupont 2017-01-28 17:16:21

il suffit de remplacer couleurs atributtes par votre couleur

"151940920 d'arrière-plan".xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="line">

    <stroke android:width="1dp" android:color="#D9D9D9"/>
    <corners android:radius="1dp" />

</shape>

progress.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
     android:shape="line">

    <stroke android:width="1dp" android:color="#2EA5DE"/>
    <corners android:radius="1dp" />

</shape>

de style.xml

<layer-list xmlns:android="http://schemas.android.com/apk/res/android" >

    <item
        android:id="@android:id/background"
        android:drawable="@drawable/seekbar_background"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/seekbar_progress" />
    </item>

</layer-list>

pouce.xml

<shape xmlns:android="http://schemas.android.com/apk/res/android"
    android:shape="oval">

    <size android:height="30dp" android:width="30dp"/>
    <stroke android:width="18dp" android:color="#882EA5DE"/>
    <solid android:color="#2EA5DE" />
    <corners android:radius="1dp" />

</shape>
37
répondu ionutgyn 2014-11-20 09:01:10

Google ont rendu cela plus facile dans le SDK 21. Nous avons maintenant des attributs pour spécifier les couleurs de la teinte du pouce:

android:thumbTint
android:thumbTintMode
android:progressTint

http://developer.android.com/reference/android/widget/AbsSeekBar.html#attr_android:thumbTint http://developer.android.com/reference/android/widget/AbsSeekBar.html#attr_android:thumbTintMode

32
répondu k2col 2018-01-08 21:57:09

Android seekbar custom material style, pour d'autres personnalisations seekbar http://www.zoftino.com/android-seekbar-and-custom-seekbar-examples

<style name="MySeekBar" parent="Widget.AppCompat.SeekBar">
    <item name="android:progressBackgroundTint">#f4511e</item>
    <item name="android:progressTint">#388e3c</item>
    <item name="android:colorControlActivated">#c51162</item>
</style>

seekbar custom material style

18
répondu Arnav Rao 2017-09-25 13:15:59

comme mentionné ci-dessus (@andrew), la création de seekbar personnalisé est super facile avec ce site - http://android-holo-colors.com /

il suffit d'activer SeekBar là, choisir la couleur, et recevoir toutes les ressources et la copie au projet. Puis les appliquer en xml, par exemple:

  android:thumb="@drawable/apptheme_scrubber_control_selector_holo_light"
  android:progressDrawable="@drawable/apptheme_scrubber_progress_horizontal_holo_light"
11
répondu Anton Kizema 2015-04-25 01:43:29

Juste mis

android:maxHeight="3dp"
android:minHeight="3dp"

C'est tout

10
répondu Sunday G Akinsete 2018-07-14 04:14:05
<SeekBar
android:id="@+id/seekBar1"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_gravity="center"
android:progressTint="@color/red"
android:thumbTint="@color/red" />

fonctionne comme la même réponse sélectionnée. pas besoin de faire un fichier dessinable ou autre.(En 5.0 seulement) Concernant

8
répondu Haroon Ahmed 2014-12-19 11:38:21

par défaut, android va correspondre à la couleur de progression de votre curseur à

`<item name="colorAccent">`

valeur dans vos styles .xml . Ensuite, pour définir une image de pouce de curseur personnalisé, il suffit d'utiliser ce code dans votre SeekBar bloc de mise en page xml:

android:thumb="@drawable/slider"
5
répondu Igor Ganapolsky 2016-09-08 12:59:01

si vous utilisez par défaut SeekBar fourni par android Sdk alors leur est un moyen simple de changer la couleur de cela . il suffit d'aller à la couleur.xml à l'intérieur /res/valeurs/couleurs.xml et changer le colorAccent.

<resources>
    <color name="colorPrimary">#212121</color>
    <color name="colorPrimaryDark">#1e1d1d</color>
     <!-- change below line -->
    <color name="colorAccent">#FF4081</color>
</resources>
3
répondu redblood 2015-10-24 15:11:11
LayerDrawable progressDrawable = (LayerDrawable) mSeekBar.getProgressDrawable();

// progress bar line *progress* color
Drawable processDrawable = progressDrawable.findDrawableByLayerId(android.R.id.progress);

// progress bar line *background* color
Drawable backgroundDrawable = progressDrawable.findDrawableByLayerId(android.R.id.background);

// progress bar line *secondaryProgress* color
Drawable secondaryProgressDrawable = progressDrawable.findDrawableByLayerId(android.R.id.secondaryProgress);
processDrawable.setColorFilter(Color.RED, PorterDuff.Mode.SRC_IN);

// progress bar line all color
mSeekBar.getProgressDrawable().setColorFilter(Color.BLUE, PorterDuff.Mode.SRC_IN);

// progress circle color
mSeekBar.getThumb().setColorFilter(Color.GREEN, PorterDuff.Mode.SRC_IN);
3
répondu Hugo 2017-03-23 08:38:56

je modifie le background_fill.xml

<?xml version="1.0" encoding="UTF-8"?>
  <shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<size android:height="1dp" />
<gradient
    android:angle="0"
    android:centerColor="#616161"
    android:endColor="#616161"
    android:startColor="#616161" />
<corners android:radius="0dp" />
<stroke
    android:width="1dp"
    android:color="#616161" />
<stroke
    android:width="1dp"
    android:color="#616161" />
</shape>

et le progress_fill.xml

<?xml version="1.0" encoding="UTF-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="line" >
<size android:height="1dp" />
<gradient
    android:angle="0"
    android:centerColor="#fafafa"
    android:endColor="#fafafa"
    android:startColor="#fafafa" />
<corners android:radius="1dp" />
<stroke
    android:width="1dp"
    android:color="#cccccc" />
<stroke
    android:width="1dp"
    android:color="#cccccc" />
 </shape>

pour rendre l'arrière-plan et le progrès 1dp de hauteur.

2
répondu vrunoa 2015-02-25 00:17:36

si vous regardez les ressources Android, la barre de recherche réellement utiliser des images.

vous devez faire un dessin qui est transparent en haut et en bas pour dire 10px et la ligne centrale 5px est visible.

désignent l'image jointe. Vous devez le transformer en un NinePatch.

enter image description here

1
répondu Sagar Waghmare 2013-04-23 08:17:02

Simple façon de changer la couleur de la barre de recherche ...

 <ProgressBar
            android:id="@+id/progress"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_gravity="center"
            android:theme="@style/Progress_color"/>

Style: Progress_color

 <style name="Progress_color">
    <item name="colorAccent">@color/white</item> <!-- Whatever color you want-->
</style>

java changement de classe ProgressDrawable()

seek_bar.getProgressDrawable().setColorFilter(getResources().getColor(R.color.white), PorterDuff.Mode.MULTIPLY);
1
répondu Mathan Chinna 2017-02-14 06:06:12

sortie:

enter image description here

dans le fichier de mise en page:

        <android.support.v7.widget.AppCompatSeekBar
            android:id="@+id/seekBar_bn"
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:gravity="center"
            android:max="25"
            android:minHeight="10dp"
            android:progress="10"
            android:progressDrawable="@drawable/progress"
            android:thumb="@drawable/custom_thumb" />

drawable/progrès.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"
        android:drawable="@drawable/background_fill"/>
    <item android:id="@android:id/progress">
        <clip android:drawable="@drawable/progress_fill" />
    </item>

</layer-list>

drawable / background_fill.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="6dp"
        android:left="-6dp"
        android:right="-6dp"
        android:top="6dp">

        <shape android:shape="rectangle">
            <solid android:color="#888888" />
            <stroke
                android:width="5dp"
                android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

drawable / progress_fill.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item
        android:bottom="6dp"
        android:left="-6dp"
        android:right="-6dp"
        android:top="6dp">

        <shape android:shape="rectangle">
            <solid android:color="@color/myPrimaryColor" />
            <stroke
                android:width="5dp"
                android:color="@android:color/transparent" />
        </shape>
    </item>
</layer-list>

drawable/custom_thumb.xml

<?xml version="1.0" encoding="utf-8"?>
<layer-list xmlns:android="http://schemas.android.com/apk/res/android">
    <item>
        <shape android:shape="oval">
            <solid android:color="@color/myPrimaryColor"/>
            <size
                android:width="22dp"
                android:height="22dp"/>
        </shape>
    </item>
</layer-list>

les couleurs.xml

<color name="myPrimaryColor">#660033</color>
1
répondu Ahamadullah Saikat 2018-04-28 09:27:23

pour ceux qui utilisent la liaison de données:

  1. ajouter la méthode statique suivante à toute classe

    @BindingAdapter("app:thumbTintCompat")
    public static void setThumbTint(SeekBar seekBar, @ColorInt int color) {
        seekBar.getThumb().setColorFilter(color, PorterDuff.Mode.SRC_IN);
    }
    
  2. ajouter app:thumbTintCompat attribut à votre SeekBar

    <SeekBar
           android:id="@+id/seek_bar"
           style="@style/Widget.AppCompat.SeekBar"
           android:layout_width="wrap_content"
           android:layout_height="wrap_content"
           app:thumbTintCompat="@{@android:color/white}"
    />
    

C'est tout. Vous pouvez maintenant utiliser app:thumbTintCompat avec n'importe quel SeekBar . La teinte de progression peut être configurée de la même manière.

Note: cette méthode est également compatible avec les dispositifs pré-sucette.

0
répondu Stan Mots 2017-03-16 11:54:35

petite correction à la réponse de @arnav-rao:

pour s'assurer que le pouce est bien coloré, utilisez:

<style name="MySeekBar" parent="Widget.AppCompat.SeekBar">
    <item name="android:progressBackgroundTint">@color/colorBgTint</item>
    <item name="android:progressTint">@color/colorProgressTint</item>
    <item name="android:thumbTint">@color/colorThumbTint</item>
</style>

ici Androïde: les couleurs du pouce en fait le" pouce "

0
répondu levus.lazarus 2018-05-10 21:45:47

vérifier ce tutoriel très bon

https://www.lvguowei.me/post/customize-android-seekbar-color /

simple:

<SeekBar
                android:id="@+id/seekBar"
                android:layout_width="match_parent"
                android:layout_height="wrap_content"
                android:max="100"
                android:maxHeight="3dp"
                android:minHeight="3dp"
                android:progressDrawable="@drawable/seekbar_style"
                android:thumbTint="@color/positive_color"/>

puis un fichier de style:

<?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="@color/positive_color" />
        </shape>
    </item>
    <item android:id="@android:id/progress">
        <clip>
            <shape android:shape="rectangle" >
                <solid
                    android:color="@color/positive_color" />
            </shape>
        </clip>
    </item>
</layer-list>
0
répondu Joolah 2018-05-16 08:09:41

Vous pouvez aussi le faire de cette façon :

<SeekBar
    android:id="@+id/redSeekBar"
    android:layout_width="match_parent"
    android:layout_height="wrap_content"
    android:progressDrawable="@color/red"
    android:maxHeight="3dip"/>

j'Espère que ça aidera!

-1
répondu Omar Aflak 2015-12-06 16:23:20