如何获得宽度以正确设置LinearGradient

时间:2011-12-22 15:32:04

标签: android user-interface seekbar linear-gradients

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

    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。

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

谢谢!

2 个答案:

答案 0 :(得分:1)

您可以在资源中添加dimension,当然,不同屏幕可以有不同的值 - 如果您没有定义特定的dpi,它也会适当缩放(例如)

答案 1 :(得分: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);