2015-06-16 4 views

ответ

4

заменить ProgressDrawable от моего answer с видоизмененной:

class ProgressDrawable extends Drawable { 
    private static final int NUM_SEGMENTS = 4; 
    private final int mForeground; 
    private final int mBackground; 
    private final Paint mPaint = new Paint(); 
    private final RectF mSegment = new RectF(); 

    public ProgressDrawable(int fgColor, int bgColor) { 
     mForeground = fgColor; 
     mBackground = bgColor; 
    } 

    @Override 
    protected boolean onLevelChange(int level) { 
     invalidateSelf(); 
     return true; 
    } 

    @Override 
    public void draw(Canvas canvas) { 
     float level = getLevel()/10000f; 
     Rect b = getBounds(); 
     float gapWidth = b.height()/2f; 
     float segmentWidth = (b.width() - (NUM_SEGMENTS - 1) * gapWidth)/NUM_SEGMENTS; 
     mSegment.set(0, 0, segmentWidth, b.height()); 
     mPaint.setColor(mForeground); 

     for (int i = 0; i < NUM_SEGMENTS; i++) { 
      float loLevel = i/(float) NUM_SEGMENTS; 
      float hiLevel = (i + 1)/(float) NUM_SEGMENTS; 
      if (loLevel <= level && level <= hiLevel) { 
       float middle = mSegment.left + NUM_SEGMENTS * segmentWidth * (level - loLevel); 
       canvas.drawRect(mSegment.left, mSegment.top, middle, mSegment.bottom, mPaint); 
       mPaint.setColor(mBackground); 
       canvas.drawRect(middle, mSegment.top, mSegment.right, mSegment.bottom, mPaint); 
      } else { 
       canvas.drawRect(mSegment, mPaint); 
      } 
      mSegment.offset(mSegment.width() + gapWidth, 0); 
     } 
    } 

    @Override 
    public void setAlpha(int alpha) { 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) { 
    } 

    @Override 
    public int getOpacity() { 
     return PixelFormat.TRANSLUCENT; 
    } 
} 

и создать его так:

Drawable d = new ProgressDrawable(0xdd00ff00, 0x4400ff00); 
+0

Спасибо за помощь, вы ar e champ, я также написал код, который работает хорошо – Naga

+0

как сделать этот индикатор производительности ровно в вертикальном направлении? – abh22ishek

2
/** 
* Created by nagendra on 16/06/15. 
*/ 
public class ProgressBarDrawable extends Drawable { 

    private int parts = 10; 

    private Paint paint = null; 
    private int fillColor = Color.parseColor("#2D6EB9"); 
    private int emptyColor = Color.parseColor("#233952"); 
    private int separatorColor = Color.parseColor("#FFFFFF"); 
    private RectF rectFill = null; 
    private RectF rectEmpty = null; 
    private List<RectF> separators = null; 

    public ProgressBarDrawable(int parts) 
    { 
     this.parts = parts; 
     this.paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
     this.separators = new ArrayList<RectF>(); 
    } 

    @Override 
    protected boolean onLevelChange(int level) 
    { 
     invalidateSelf(); 
     return true; 
    } 

    @Override 
    public void draw(Canvas canvas) 
    { 
     // Calculate values 
     Rect b = getBounds(); 
     float width = b.width(); 
     float height = b.height(); 

     int spaceFilled = (int)(getLevel() * width/10000); 
     this.rectFill = new RectF(0, 0, spaceFilled, height); 
     this.rectEmpty = new RectF(spaceFilled, 0, width, height); 

     int spaceBetween = (int)(width/100); 
     int widthPart = (int)(width/this.parts - (int)(0.9 * spaceBetween)); 
     int startX = widthPart; 
     for (int i=0; i<this.parts - 1; i++) 
     { 
      this.separators.add(new RectF(startX, 0, startX + spaceBetween, height)); 
      startX += spaceBetween + widthPart; 
     } 


     // Foreground 
     this.paint.setColor(this.fillColor); 
     canvas.drawRect(this.rectFill, this.paint); 

     // Background 
     this.paint.setColor(this.emptyColor); 
     canvas.drawRect(this.rectEmpty, this.paint); 

     // Separator 
     this.paint.setColor(this.separatorColor); 
     for (RectF separator : this.separators) 
     { 
      canvas.drawRect(separator, this.paint); 
     } 
    } 

    @Override 
    public void setAlpha(int alpha) 
    { 
    } 

    @Override 
    public void setColorFilter(ColorFilter cf) 
    { 
    } 

    @Override 
    public int getOpacity() 
    { 
     return PixelFormat.TRANSLUCENT; 
    } 
} 

в XM Layout

<ProgressBar 
     android:id="@+id/progress_bar_test" 
     android:layout_width="match_parent" 
     android:layout_height="wrap_content" 
     style="?android:attr/progressBarStyleHorizontal" 
     android:max="100" 
     android:progress="10" 
     android:layout_marginLeft="16dp" 
     android:layout_marginRight="16dp" 
     /> 



ProgressBar progressBar= (ProgressBar)findViewById(R.id.progress_bar_test); 
ProgressBarDrawable bgProgress= new ProgressBarDrawable(5); 
progressBar.setProgressDrawable(bgProgress); 
+0

вы дублируете две ошибки Der Golem: 1) вы «маскируете» индикатор выполнения с прямоугольниками, нарисованными в separatorColor (что, если цвет фона меняется?), 2) - изменение прогресса не отображается пользователю, когда текущий прогресс замаскирован разделителем, нарисованным в 1) выше – pskink

+0

Я изменил конструктор так, что вы можете передать все, что захотите, я делаю это даже – Naga

+0

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

Смежные вопросы