2016-05-29 209 views
2

我正在尝试创建一个圆角方形线条进度条来绘制图像周围的进度。Android - 圆角方形线条进度条

enter image description here

到目前为止,我有以下XML定义我的圆角正方形线:

<shape xmlns:android="http://schemas.android.com/apk/res/android" > 

    <stroke 
     android:width="6dp" 
     android:color="@android:color/holo_green_light" /> 

    <padding 
     android:left="5dp" 
     android:right="5dp" 
     android:bottom="5dp" 
     android:top="5dp" /> 

    <corners android:radius="50dp" /> 

</shape> 

我知道这个解决方案:https://github.com/mrwonderman/android-square-progressbar但我不感兴趣的效果不是我想要的。

我试图在圆角正方形线上创建一个简单的圆形,并试图将两者与PorterDuff合并,但到目前为止我还无法创建进度条效果。绘制该圆的一个馅饼来绘制进度。

我也尝试创建圆角正方形程序,以防XML扩展被视为普通图像,并且在PorterDuff合并期间考虑了所有像素。但结果相同。

+0

创建自定义'调用'时将使用Drawable'类setProgressDrawable' – pskink

+0

@ pskink,是的,谢谢,但如何在线上绘制正确的进度效果? – Bibu

+0

您是否创建了自定义Drawable类?什么问题你有什么时候绘制轮回? – pskink

回答

3

试试这个简单的自定义类:

class V extends View { 
    Path path = new Path(); 
    Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    float length; 
    float[] intervals = {0, 0}; 

    public V(Context context) { 
     super(context); 
     paint.setColor(Color.GREEN); 
     paint.setStyle(Paint.Style.STROKE); 
     paint.setStrokeWidth(20); 
    } 

    @Override 
    protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
     path.reset(); 
     RectF rect = new RectF(0, 0, w, h); 
     float inset = paint.getStrokeWidth(); 
     rect.inset(inset, inset); 

     path.addRoundRect(rect, 100, 100, Path.Direction.CW); 
     length = new PathMeasure(path, false).getLength(); 
     intervals[0] = intervals[1] = length; 
     PathEffect effect = new DashPathEffect(intervals, length); 
     paint.setPathEffect(effect); 
    } 

    public void setProgress(int progress) { 
     PathEffect effect = new DashPathEffect(intervals, length - length * progress/100); 
     paint.setPathEffect(effect); 
     invalidate(); 
    } 

    @Override 
    protected void onDraw(Canvas canvas) { 
     canvas.drawPath(path, paint); 
    } 
} 

测试代码(放在里面Activity#onCreate):

LinearLayout ll = new LinearLayout(this); 
    ll.setOrientation(LinearLayout.VERTICAL); 
    SeekBar sb = new SeekBar(this); 
    ll.addView(sb); 
    final V v = new V(this); 
    ll.addView(v); 
    setContentView(ll); 

    SeekBar.OnSeekBarChangeListener sbcl = new SeekBar.OnSeekBarChangeListener() { 
     @Override 
     public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { 
      v.setProgress(progress); 
     } 
     @Override public void onStartTrackingTouch(SeekBar seekBar) {} 
     @Override public void onStopTrackingTouch(SeekBar seekBar) {} 
    }; 
    sb.setOnSeekBarChangeListener(sbcl);