2015-02-27 2 views
0

IllustrationAndroid drawArc нерегулярной дуга

Я рисую несколько сегментов дуги, используя тот же RectF, однако дуги не выстраиваются надлежащим образом. Я пробовал все параметры CAP, но он никогда не выглядит симметричным.

private void initPaint(TypedArray a){ 

    segmentInactivePaint = new Paint(Paint.ANTI_ALIAS_FLAG); 
    segmentInactivePaint.setColor(a.getColor(R.styleable.SegmentsCustomView_segmentBgColor, segmentBgColor)); 
    segmentInactivePaint.setStrokeWidth(30f); 
    segmentInactivePaint.setStyle(Paint.Style.STROKE); 

    segmentsBGPaint = new Paint(segmentInactivePaint); 
    segmentsBGPaint.setAlpha(64); 

    segmentActivePaint = new Paint(segmentInactivePaint); 
    segmentActivePaint.setColor(a.getColor(R.styleable.SegmentsCustomView_segmentActiveColor,segmentActiveColor)); 

} 

@Override 
protected void onSizeChanged(int w, int h, int oldw, int oldh) { 
    super.onSizeChanged(w, h, oldw, oldh); 
    if(getWidth()<getHeight()) { 
     rectF.set(getLeft(), getTop(), getWidth() - getLeft(), getWidth() - getLeft()); 
    }else{ 
     rectF.set(getLeft(), getTop(), getHeight() - getTop(), getHeight() - getTop()); 

    } 
} 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    position = 0; 
    for(int i=0; i < segmentSizes.length; i++){ 
     canvas.drawArc(rectF,position-180,segmentSizes[i]-segmentGap,false, 
       i != segmentActive ? 
          i < segmentActive ? segmentInactivePaint : segmentsBGPaint 
         : segmentActivePaint); 
     position+=segmentSizes[i]; 
    } 

} 

Я также попытался с помощью статического RectF, который не изменяется при изменении размеров каких-либо событий, так что это не проблема.

RectF (0):﹕ [75.0,75.0][759.0,759.0] 
RectF (1):﹕ [75.0,75.0][759.0,759.0] 
RectF (2):﹕ [75.0,75.0][759.0,759.0] 
RectF (3):﹕ [75.0,75.0][759.0,759.0] 
RectF (4):﹕ [75.0,75.0][759.0,759.0] 

Мое предположение было бы, что метод Canvas.drawArc создает частичный путь и, следовательно, интерполяция дуги всегда отличается от дуги полной окружности.

Толчок в правильном направлении был бы очень признателен.

ответ

0

Так что мне удалось исправить проблему, используя Path вместо метода drawArc() холста. Перематывая путь, когда я рисую новый сегмент.

@Override 
    protected void onDraw(Canvas canvas) { 
     super.onDraw(canvas); 
     position = 0; 
     for(int i=0; i < segmentSizes.length; i++){ 
      if(i == segmentActive){ 
       tmpPaint = segmentActivePaint; 
      }else if(i > segmentActive){ 
       tmpPaint = segmentsBGPaint; 
      }else{ 
       tmpPaint = segmentInactivePaint; 
      } 

      path.rewind(); 
      path.addArc(rectF,position - 180, segmentSizes[i] - segmentGap); 
      canvas.drawPath(path, tmpPaint); 
      position+=segmentSizes[i]; 
     } 
     path.reset(); 

    } 

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

Метод drawArc() кажется довольно похожим на addArc(), однако он сбрасывает путь при каждом вызове.