4

Я пытаюсь создать ProgresBar, который выглядит следующим образом:Пользовательские ProgressBar

Desired ProgressBar

До сих пор я создал объект, который простирается ProgressBar, и теперь я пытаюсь выяснить, что мой следующий уровень есть.

Я знаю, что мне нужно переопределить onDraw() с некоторой логикой, которая решит, сколько квадратов для цвета. Это тривиально.

То, что я не знаю, как это сделать, это получить эти квадраты в первую очередь. Как я могу заменить шаблон по умолчанию, поэтому, когда я добавляю собственную панель в макете, я могу видеть что-то вроде моего изображения?

+0

все, что вам нужно, чтобы создать пользовательский прогресс вытяжке, который реагирует на изменения уровня, см вытяжке. onLevelChange – pskink

+0

@pskink вы говорите, что мне не нужно использовать панель прогресса? – BloonsTowerDefence

+0

yes, просто протяните Drawable и используйте setProgressDrawable – pskink

ответ

7

попробовать этот обычай Drawable:

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; 
    } 
} 

и протестировать его со следующим в 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);