2010-12-03 4 views
1

Je souhaite utiliser une SeekBar (c.-à-d. Java Slider old school) dans un sélecteur de dégradés de couleurs. J'ai vu quelques exemples comme celui-ci mais ils ont tous besoin de faire de nouvelles classes et autres. Il doit y avoir un moyen de modifier ou de remplacer les classes d'origine. Ou simplement remplacer l'arrière-plan avec un dégradé.Comment créer un dégradé de couleurs dans un SeekBar?

Répondre

10

Je l'ai compris ici est comment vous le faites.

Vous créez une barre de recherche standard dans votre fichier XML.

<SeekBar 
     android:id="@+id/seekbar_font" 
     android:layout_width="fill_parent" 
     android:layout_height="wrap_content" 
     android:layout_margin="10px" 
     android:layout_below="@id/color_font_text" 
     android:max="100" 
     android:progress="50"></SeekBar> 

Ensuite, vous personnalisez la barre de recherche dans votre onCreate() en créant un boxShape puis forcer un LinearGradient à l'intérieur.

LinearGradient test = new LinearGradient(0.f, 0.f, 300.f, 0.0f, 

     new int[] { 0xFF000000, 0xFF0000FF, 0xFF00FF00, 0xFF00FFFF, 
     0xFFFF0000, 0xFFFF00FF, 0xFFFFFF00, 0xFFFFFFFF}, 
     null, TileMode.CLAMP); 
ShapeDrawable shape = new ShapeDrawable(new RectShape()); 
shape.getPaint().setShader(test); 

SeekBar seekBarFont = (SeekBar)findViewById(R.id.seekbar_font); 
seekBarFont.setProgressDrawable((Drawable)shape); 

Voici une image du code actuel au-dessus SeekBar Color Gradient

+0

Merci beaucoup pour ce morceau de code, fonctionne comme un charme. Mais comment obtenez-vous la couleur choisie alors? Le seul paramètre que je peux obtenir est la progression, alors, comment relier la couleur à la progression? Merci d'avance! –

+0

Ouais c'est la partie difficile. Puisque le gradient n'est techniquement pas linéaire, vous devez écrire votre propre algorithme pour corréler l'emplacement du sélecteur avec la couleur réelle de la barre de progression. – JPM

+0

Je pense que le paramètre 'x2' pour' LinearGradient' aurait besoin d'être ajusté en fonction de la largeur de la barre de recherche pour que le dégradé remplisse exactement la barre entière. Utiliser 'GradientDrawable' évite à la place ce problème:' seekBar.setProgressDrawable (nouveau GradientDrawable (GradientDrawable.Orientation.LEFT_RIGHT, nouvel int [] {startColor, endColor})) ' – hagabaka

7

Ceci est en plus de la solution fournie à l'aide LinearGradient. Essayez cette logique pour traduire la progression en rgb:

lineColorSeekbar.setMax(256*7-1); 
     lineColorSeekbar.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { 
      @Override 
      public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
       if(fromUser){ 
        int r = 0; 
        int g = 0; 
        int b = 0; 

        if(progress < 256){ 
         b = progress; 
        } else if(progress < 256*2) { 
         g = progress%256; 
         b = 256 - progress%256; 
        } else if(progress < 256*3) { 
         g = 255; 
         b = progress%256; 
        } else if(progress < 256*4) { 
         r = progress%256; 
         g = 256 - progress%256; 
         b = 256 - progress%256; 
        } else if(progress < 256*5) { 
         r = 255; 
         g = 0; 
         b = progress%256; 
        } else if(progress < 256*6) { 
         r = 255; 
         g = progress%256; 
         b = 256 - progress%256; 
        } else if(progress < 256*7) { 
         r = 255; 
         g = 255; 
         b = progress%256; 
        } 

        lineColorSeekbar.setBackgroundColor(Color.argb(255, r, g, b)); 
       } 
      } 

      @Override 
      public void onStartTrackingTouch(SeekBar seekBar) { 

      } 

      @Override 
      public void onStopTrackingTouch(SeekBar seekBar) { 

      } 
     }); 
+0

Merci, cela a bien fonctionné. Comment pouvez-vous revenir en arrière étant donné r, g, b? Nous avons un second sélecteur de couleur et nous voulons mettre à jour le curseur en conséquence. – RealCasually

+0

Chaîne hex = String.format ("#% 02X% 02X% 02X", r, g, b); – user3219446

Questions connexes