0

我正在从 SeekBar 创建一个颜色选择器。到目前为止,我已经成功替换了 onCreate() 中的进度drawable,如下所示:

    SeekBar colorChooser = (SeekBar) findViewById(R.id.seekBarColorChooser);

    LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f,
            new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                    0xFF00FFFF, 0xFF0000FF,
                                    0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP);

    RoundRectShape roundedRect = new RoundRectShape(new float [] {10f, 10f, 10f, 10f, 10f, 10f, 10f, 10f} , null, null);

    ShapeDrawable shape = new ShapeDrawable(roundedRect);
    shape.getPaint().setShader(rainbow);

    colorChooser.setProgressDrawable((Drawable) shape);

这完美!结果正是我正在寻找的结果,但是,我关心的一件事是 LinearGradient 中的硬编码宽度(100f)。

由于此对话框尚未实现,因此 SeekBar 或 Dialog 似乎都没有任何宽度。换句话说,colorChooser.getWidth() 返回 0。

如果宽度太小,渐变在左侧被压缩。如果太大,只会出现一部分渐变。如何获得一个好的宽度值来设置线性渐变以正确显示?

谢谢!

4

2 回答 2

1

您可以为您的资源添加一个维度,当然,对于不同的屏幕可以有不同的值 - 如果您没有定义特定的 dpi(例如),它也会适当地缩放。

于 2011-12-22T15:36:32.083 回答
1

代替

LinearGradient rainbow = new LinearGradient(0f, 0f, 100f, 0f,
        new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                0xFF00FFFF, 0xFF0000FF,
                                0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 

LinearGradient rainbow = new LinearGradient(0f, 0f, 500f, 0f,
        new int[] { 0xFFFF0000, 0xFFFFFF00, 0xFF00FF00, 
                                0xFF00FFFF, 0xFF0000FF,
                                0xFFFF00FF, 0xFFFF0000}, null, TileMode.CLAMP); 
于 2012-05-09T07:15:59.303 回答