ICS(Holo)のデフォルトのSeekBarに似ているが、プログラムの色を変更できるSeekBarを作成したいと思います。私のアプリはICSを対象としていますが、Froyo以降との互換性を維持するために必要です。
プログレスとサムドローアブルを設定する必要があることはわかっています。また、色を変更できるように、これらのドローアブルをプログラムで生成できる必要があります。親指は2つの同心円であり、外側の円の透明度が低いため、それほど難しくはありません。
私が抱えている問題は、背景がほんの数ピクセルの高さの灰色の線である必要があるということです。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)でテスト済み)。それが最も厄介なことなので、私は主に正しい場所で終わる行について心配しています。