5

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

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()います。ただし、画面には何も描画されません。私はいくつかのバリエーションを試しましたが、役に立ちませんでした。私が間違っていることはありますか?これを行う簡単な方法はありますか?円のパーセンテージを考えると、私は円のその多くを画面に描かれるものにすることができるようにしたいと思います。

4

1 に答える 1

9

ここには 2 つのことがあります。

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

  2. CanvasにはdrawArc、開始角度とスイープする度数を取るメソッドがあります。を参照してくださいCanvas.drawArc(RectF, float, float, boolean, Paint)。これは私が円を描くために探していたものです。

編集: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.
}
于 2013-03-21T23:15:23.953 に答える