2010-12-03 91 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) { 

      } 
     });