2013-03-21 14 views
5

Sto provando ad animare disegnando un cerchio. A mio avviso personalizzato, hoCerchio di disegnare Android con percorso

private final Paint mPaint = new Paint() { 
    { 
     setDither(true); 
     setStyle(Paint.Style.STROKE); 
     setStrokeCap(Paint.Cap.ROUND); 
     setStrokeJoin(Paint.Join.ROUND); 
     setColor(Color.BLUE); 
     setStrokeWidth(30.0f); 
     setAntiAlias(true); 
    } 
}; 
... 
protected void onDraw(Canvas canvas) { 
    super.onDraw(); 
    if (mOval == null) { 
     mOval = new RectF(getLeft(), getTop(), getRight(), getBottom()); 
    } 
    if (mPath == null) { 
     mPath = new Path(); 
    mPath.moveTo(0, getHeight()/2); 
    } 

    float sweepAngle = Math.min((float) mElapsedTime/1000 * 60 * 1, 1) * 360; 
    if (sweepAngle == 0) { 
     mPath.reset(); 
    } else if (mCurrentAngle != sweepAngle) { 
    mPath.arcTo(mOval, mCurrentAngle, sweepAngle); 
    } 
    mCurrentAngle = sweepAngle; 
    canvas.drawPath(mPath, mPaint); 
} 

A intervalli, sto aggiornando mElapsedTime e chiamando invalidate(). Tuttavia, nulla viene disegnato sullo schermo. Ho provato diverse varianti, ma senza risultato. C'è qualcosa che sto sbagliando? C'è un modo più semplice per farlo? Data una percentuale di un cerchio, voglio essere in grado di fare in modo che gran parte del cerchio sia ciò che viene disegnato sullo schermo.

risposta

8

Ci sono due cose qui:

  1. Dovete chiamare canvas.drawOval(...) prima di disegnare l'arco sul ovale. Altrimenti non verrà visualizzato. Questo è il motivo per cui il mio metodo non ha funzionato.

  2. Canvas ha un metodo drawArc che prende un angolo di inizio e un gradi da spazzare. Vedi http://developer.android.com/reference/android/graphics/Canvas.html#drawArc%28android.graphics.RectF,%20float,%20float,%20boolean,%20android.graphics.Paint%29. Questo è quello che stavo cercando per disegnare cerchi.

EDIT: ecco il relativo codice dalla mia View sottoclasse:

private final Paint mArcPaint = new Paint() { 
    { 
     setDither(true); 
     setStyle(Paint.Style.STROKE); 
     setStrokeCap(Paint.Cap.ROUND); 
     setStrokeJoin(Paint.Join.ROUND); 
     setColor(Color.BLUE); 
     setStrokeWidth(40.0f); 
     setAntiAlias(true); 
    } 
}; 

private final Paint mOvalPaint = new Paint() { 
    { 
     setStyle(Paint.Style.FILL); 
     setColor(Color.TRANSPARENT); 
    } 
}; 

@Override 
protected void onDraw(Canvas canvas) { 
    super.onDraw(canvas); 
    RectF mOval = new RectF(left, top, right, bottom); //This is the area you want to draw on 
    float sweepAngle = 270; //Calculate how much of an angle you want to sweep out here 
    canvas.drawOval(mOval, mOvalPaint); 
    canvas.drawArc(mOval, 269, sweepAngle, false, mArcPaint); //270 is vertical. I found that starting the arc from just slightly less than vertical makes it look better when the circle is almost complete. 
} 
+0

hai qualche codice? Im con lo stesso problema – Machete

+0

@jmachete Ho aggiornato con un po 'di codice. – karl

+0

Come posso disegnare questo al centro della tela? – user2095470