我想制作一个看起来类似于 ICS (Holo) 中的默认 SeekBar 但能够在程序中更改颜色的 SeekBar。我的应用程序以 ICS 为目标,但我需要它与 Froyo 及更高版本保持兼容。
我知道我需要设置进度和拇指可绘制对象,并且我需要能够以编程方式生成这些可绘制对象,以便我可以更改颜色。拇指应该不会太难,因为它只是两个同心圆,外面的一个透明度较低。
我遇到的问题是背景需要是一条只有几个像素高的灰线。如何为可用作 SeekBar 背景的细水平灰线制作 Drawable?
编辑:
我现在使用这个得到了非常接近的东西:
private int px_to_dip(int x)
{
return (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, x, res.getDisplayMetrics());
}
@SuppressWarnings("deprecation")
public void setInterfaceColor(int color)
{
int dip20 = px_to_dip(20);
int dip40 = px_to_dip(40);
Bitmap thumbbm = Bitmap.createBitmap(dip40, dip40, Bitmap.Config.ARGB_8888);
Canvas thumb = new Canvas(thumbbm);
Paint thumbp = new Paint(Paint.ANTI_ALIAS_FLAG);
thumbp.setColor(Color.argb(Color.alpha(color)/2, Color.red(color), Color.green(color), Color.blue(color)));
thumb.drawCircle(dip20, dip20, dip20, thumbp);
thumbp.setColor(color);
thumb.drawCircle(dip20, dip20, px_to_dip(8), thumbp);
BitmapDrawable thumbdraw = new BitmapDrawable(thumbbm);
thumbdraw.setBounds(new Rect(0, 0, thumbdraw.getIntrinsicWidth(), thumbdraw.getIntrinsicHeight()));
sb.setThumb(thumbdraw);
sb.setThumbOffset(0);
//int colors[] = {Color.TRANSPARENT, Color.GRAY, Color.TRANSPARENT};
//GradientDrawable prog = new GradientDrawable(GradientDrawable.Orientation.TOP_BOTTOM, colors);
//prog.setShape(GradientDrawable.RECTANGLE);
Bitmap progbm = Bitmap.createBitmap(sb.getProgressDrawable().getIntrinsicWidth(), dip40, Bitmap.Config.ARGB_8888);
Canvas prog = new Canvas(progbm);
Paint progp = new Paint(Paint.ANTI_ALIAS_FLAG);
progp.setColor(Color.GRAY);
prog.drawLine(dip20, dip20, sb.getProgressDrawable().getIntrinsicWidth()-dip20, dip20, progp);
BitmapDrawable progdraw = new BitmapDrawable(progbm);
Rect bounds = sb.getProgressDrawable().getBounds();
sb.setProgressDrawable(progdraw);
sb.getProgressDrawable().setBounds(bounds);
sb.refreshDrawableState();
}
问题是背景(应该是一条 1 像素高的灰线)从最左边到最右边,而它应该在拇指的中心开始和结束。拇指是一个圆圈。我还需要调整尺寸。我的 px_to_dip 大部分工作,但尺寸看起来有点偏(在我的 240dpi Galaxy Note (CM9) 和我的 160dpi Archos A43 (CM7) 和 HP TouchPad (CM9) 上测试)。不过,我主要关心在正确位置结束的行,因为这是最烦人的事情。