Custom ProgressBar

Estoy tratando de crear un ProgresBar que se parece a lo siguiente:

ProgressBar deseado

Hasta ahora, he creado un objeto que amplía ProgressBar, y ahora estoy tratando de descubrir cuál es mi siguiente paso.

Sé que tengo que anular onDraw() con alguna lógica que decida cuántos cuadrados se colorearán. Esto es trivial.

Lo que no sé cómo hacer es obtener estos cuadrados en primer lugar. ¿Cómo puedo reemplazar el dibujo por defecto, así que cuando agrego mi barra personalizada en el diseño, puedo ver algo como mi imagen?

prueba este drawable personalizado:

 class ProgressDrawable extends Drawable { private static final int NUM_RECTS = 10; Paint mPaint = new Paint(); @Override protected boolean onLevelChange(int level) { invalidateSelf(); return true; } @Override public void draw(Canvas canvas) { int level = getLevel(); Rect b = getBounds(); float width = b.width(); for (int i = 0; i < NUM_RECTS; i++) { float left = width * i / NUM_RECTS; float right = left + 0.9f * width / NUM_RECTS; mPaint.setColor((i + 1) * 10000 / NUM_RECTS <= level? 0xff888888 : 0xffbbbbbb); canvas.drawRect(left, b.top, right, b.bottom, mPaint); } } @Override public void setAlpha(int alpha) { } @Override public void setColorFilter(ColorFilter cf) { } @Override public int getOpacity() { return PixelFormat.TRANSLUCENT; } } 

y probarlo con lo siguiente en onCreate:

 LinearLayout ll = new LinearLayout(this); ll.setOrientation(LinearLayout.VERTICAL); final ProgressBar pb = new ProgressBar(this, null, android.R.attr.progressBarStyleHorizontal); Drawable d = new ProgressDrawable(); pb.setProgressDrawable(d); pb.setPadding(20, 20, 20, 0); ll.addView(pb); OnSeekBarChangeListener l = new OnSeekBarChangeListener() { @Override public void onStopTrackingTouch(SeekBar seekBar) { } @Override public void onStartTrackingTouch(SeekBar seekBar) { } @Override public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { int newProgress = pb.getMax() * progress / seekBar.getMax(); Log.d(TAG, "onProgressChanged " + newProgress); pb.setProgress(newProgress); } }; int[] maxs = {4, 10, 60, 110}; for (int i = 0; i < maxs.length; i++) { SeekBar sb = new SeekBar(this); sb.setMax(maxs[i]); sb.setOnSeekBarChangeListener(l); sb.setPadding(20, 20, 20, 0); ll.addView(sb); } setContentView(ll);