2013-03-21 18 views
5

Próbuję animować rysowanie koła. W moim widoku niestandardowego, mamKoło rysowania systemu Android ze ścieżką

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); 
} 

w odstępach, mam aktualizacji mElapsedTime i nazywając invalidate(). Jednak nic nie jest rysowane na ekranie. Próbowałem kilku odmian, ale bezskutecznie. Czy jest coś, co robię źle? Czy istnieje prostszy sposób na zrobienie tego? Biorąc pod uwagę pewien procent koła, chcę móc sprawić, aby ta część koła była tym, co jest rysowane na ekranie.

Odpowiedz

8

Są dwie rzeczy tutaj:

  1. Trzeba zadzwonić canvas.drawOval(...) przed rysunek łuku na owalu. W przeciwnym razie nie pojawi się. Właśnie dlatego moja metoda nie zadziałała.

  2. Canvas ma metodę drawArc, która przyjmuje kąt początkowy i stopnie do zamiatania. Zobacz http://developer.android.com/reference/android/graphics/Canvas.html#drawArc%28android.graphics.RectF,%20float,%20float,%20boolean,%20android.graphics.Paint%29. Właśnie tego szukałem, aby rysować koła.

EDIT: oto odpowiedni kod z mojego View podklasy:

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

masz kodu? Im z tym samym problemem – Machete

+0

@jmachete Zaktualizowałem trochę kodu. – karl

+0

Jak mogę narysować to na środku płótna? – user2095470