2010-12-03 98 views
1

我想將SeekBar(即舊式Java滑塊)用於顏色漸變選取器。我看到過這樣的例子,但他們都需要創建新的類和類。必須有一種方法來修改或重寫原始類。或者只是用漸變替換背景。如何在SeekBar中創建顏色漸變?

回答

10

我想到了這裏是你如何做到這一點。

您在XML中創建標準的seekbar。

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

然後通過創建一個boxShape,然後強制裏面它的LinearGradient自定義您的onCreate(),搜索條。

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

這裏是當前代碼的向上以上SeekBar Color Gradient

+0

對這段代碼非常感謝,它像一個魅力。 但是,你如何獲得顏色選擇呢? 我可以得到的唯一參數是進度,那麼,如何將顏色與進度聯繫起來? 提前致謝! – 2011-01-25 19:50:41

+0

是的,這是最難的部分。由於梯度在技術上不是線性的,因此您必須編寫自己的算法來將拾取器與實際顏色在進度條上的位置關聯起來。 – JPM 2011-01-27 00:11:16

7

這是除了使用的LinearGradient提供的解決方案的圖像。試試這個邏輯將進度轉化爲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) { 

      } 
     });