258 votes

Android - styliser la barre de recherche

Je voulais créer une barre de recherche qui ressemble à celle de l'image ci-dessous.

enter image description here

En utilisant la barre de recherche par défaut, j'obtiendrai quelque chose comme ceci :

enter image description here

Ce dont j'ai besoin, c'est de changer uniquement la couleur. Je n'ai pas besoin de styles supplémentaires. Existe-t-il une approche directe pour faire cela ou dois-je créer un tableau personnalisé ?

J'ai essayé d'en créer un personnalisé, mais je n'ai pas pu obtenir le résultat exact indiqué ci-dessus. Après avoir utilisé un drawable personnalisé, j'obtiens ce qui est montré ci-dessous :

enter image description here

Si je dois construire un modèle personnalisé, veuillez me suggérer comment réduire la largeur de la ligne de progression ainsi que sa 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>

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

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

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

47 votes

Merci de montrer un exemple de changement de style de barre de recherche qui fonctionne XD. (pas beaucoup sur l'internet).

313voto

andrew Points 2145

J'extrairais les drawables et le xml du code source Android et changerais leur couleur en rouge. Voici un exemple de la façon dont j'ai réalisé cette opération pour les drawables mdpi :

Personnalisé red_scrubber_control.xml (ajouter à res/drawable) :

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

Personnalisé : 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>

Ensuite, j'ai copié les éléments à dessiner nécessaires à partir du code source d'Android. à partir de ce lien

Il est bon de copier ces drawables pour chaque hdpi, mdpi, xhdpi. Par exemple, je n'utilise que mdpi :

Puis, avec Photoshop, changez 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

rouge_scrubber_primary_holo.9.png : red_scrubber_primary_holo.9

Red_scrubber_secondary_holo.9.png : red_scrubber_secondary_holo.9

rouge_scrubber_track_holo_light.9.png : red_scrubber_track_holo_light.9

Ajouter SeekBar à la mise en page :

<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

0 votes

Andrew, merci pour cette excellente réponse. J'ai un problème avec ceci. Lorsque j'utilise le red_scrubber_control pour le pouce, je me heurte à un problème. Si tous les drawables dans le sélecteur sont les mêmes, cela fonctionne bien, mais si je change l'un d'entre eux, j'obtiens un Resources$NotFoundException: File .../red_scrubber_control.xml from drawaable resource ID... Des idées ?

2 votes

Oups. Il s'avère que c'était lié à stackoverflow.com/questions/6669296/ . La nouvelle image que j'essayais d'ajouter était accidentellement de 37MB au lieu de 2KB...

0 votes

Est-il possible d'utiliser @dimen pour définir la taille du pouce en fonction de l'écran ?

111voto

Arnav Rao Points 2156

Style de matériau personnalisé pour la barre d'outils Android, pour d'autres personnalisations de la barre d'outils. 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:thumbTint">#c51162</item>
</style>

seekbar custom material style

Mise à jour : colorControlActivated es thumbTint maintenant.

3 votes

Excellente solution pour Android > 21

12 votes

Etes-vous sûr que colorControlActivated est le bon paramètre pour le pouce ? Il devrait être thumbTint .

4 votes

Quelle est la solution pour un niveau inférieur à l'API 21 ?

74voto

fred dupont Points 691

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

0 votes

La couleur de la boîte de dialogue de progression a changé mais pas celle des pouces, pourquoi ?

8 votes

Si vous n'avez pas besoin de faire cela en code et que vous ne voulez pas créer de listes de couches et de tableaux, vous pouvez également le faire dans le fichier xml de la barre d'outils. android:progressTint="@color/my_color" android:thumbTint="@color/another_color"

61voto

Si vous voulez exactement la même barre mais en rouge, vous pouvez ajouter un filtre de couleur PorterDuff de manière programmatique. Vous pouvez obtenir chaque drawable que vous voulez coloriser par le biais des méthodes de l'élément Barre d'avancement de la classe de base. Ensuite, il faut définir un filtre de couleur pour cela.

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

Si l'ajustement de couleur désiré ne peut pas être fait par un filtre Porter Duff, vous pouvez spécifier votre propre filtre de couleur .

3 votes

Je ne sais pas depuis quel SDK, probablement le 21, mais si vous voulez la même icône mais de couleur différente, il suffit d'ajouter la couleur "colorAccent" dans colors.xml et il l'utilisera.

46voto

k2col Points 1779

Google a facilité cette tâche 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

1 votes

Les listes de teintes s'appliquent à tous les éléments de l'interface utilisateur sur Android à partir de l'API 21, c'est la façon dont ColorAccent est appliqué.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X