2013-03-21 15 views
5

円を描くようにアニメーションしようとしています。私のカスタムビューでは、私は間隔でAndroidで円を描いて円を描く

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

を持って、私はmElapsedTimeを更新しinvalidate()を呼んでいます。ただし、画面には何も描画されません。私はいくつかのバリエーションを試しましたが、無駄です。私が間違っていることはありますか?これを行う簡単な方法はありますか?円のパーセンテージを考えると、円の多くは画面上に描画されたものにすることができます。

答えて

8

二つのものがここにあります

  1. あなたは楕円形の上に弧を描く前にcanvas.drawOval(...)を呼び出す必要があります。それ以外の場合は表示されません。これが私の方法がうまくいかなかった理由です。

  2. Canvasは、開始角度と掃引する角度を持つdrawArcメソッドを持っています。 http://developer.android.com/reference/android/graphics/Canvas.html#drawArc%28android.graphics.RectF,%20float,%20float,%20boolean,%20android.graphics.Paint%29を参照してください。これは私がサークルを描くために探していたものです。

EDIT:ここに関連するコードは、私のViewサブクラスからです:

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

あなたはすべてのコードを持っていますか?同じ問題のあるIm – Machete

+0

@jmachete私はいくつかのコードで更新しました。 – karl

+0

これをどのようにキャンバスの中心に描くことができますか? – user2095470