我想制作一个类似于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)上测试过)。我主要关心的是在正确的位置结束的线,因为这是最烦人的事情。