2016-05-29 6 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); 

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

  • Нет связанных вопросов^_^