我正在从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。
如果宽度太小,则会在左侧压缩渐变。如果它太大,则只显示渐变的一部分。如何获得良好的宽度值来设置线性渐变以正确显示?
谢谢!
答案 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);