0

drawCircleキャンバスメソッドで描画された円をバッファリングするにはどうすればよいですか?

2つの円を描く必要があります。次に、ユーザーが円を指でスイープしたときに円弧を描きます。したがって、2つの円は常に同じですが、角度(drawArcメソッドによって描画される)は常に異なります。この円をバッファリングし、何度も描画しないようにしたい...このコードは機能しましたが、もっと良いと思います。

@Override
    protected void onDraw(Canvas canvas) {
        super.onDraw(canvas); 
        /*first circle*/
        canvas.drawCircle(getWidth()/2, getHeight()/2, mRadius2, getGradient(OUTER_CIRCLE_COLOR));
        /*second circle*/
        canvas.drawCircle(getWidth()/2, getHeight()/2, mRadius, getGradient(INNER_CIRCLE_COLOR));
        rectF.set(getWidth()/2- mRadius2, getHeight()/2 - mRadius2, getWidth()/2 + mRadius2, getHeight()/2 + mRadius2);
        /*draw the arc*/
        canvas.drawArc(rectF, 180, this.getSweepAngle(), true,p);
        invalidate();
    }
4

2 に答える 2

0

キャンバスと同じサイズのビットマップを作成し、円をビットマップに描画できます。

キャンバス内のサークルを復元するためにonDraw()使用します。canvas.drawBitmap()

ただし、これは、キャンバスに複雑な形状や重い形状が描かれている場合にのみ正当化されます。2 つのサークルについては、改善が得られるかどうかはわかりません。

最初に円でビットマップを準備します。

Bitmap bitmap = Bitmap.createBitmap(width, height , Bitmap.Config.ARGB_8888);
Canvas canvas = new Canvas(bitmap);
Canvas canvas = new Canvas(bitmap);
Paint paint = new Paint();

/*first circle*/
canvas.drawCircle(getWidth()/2, getHeight()/2, mRadius2, getGradient(OUTER_CIRCLE_COLOR));
/*second circle*/
canvas.drawCircle(getWidth()/2, getHeight()/2, mRadius, getGradient(INNER_CIRCLE_COLOR));

で使用しますonDraw()

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas); 

    canvas.drawBitmap(bitmap, 0, 0, paint);

 /*draw the arc*/
    canvas.drawArc(rectF, 180, this.getSweepAngle(), true,p);
    invalidate();
}

よろしく

于 2012-10-29T19:08:10.933 に答える
0

onDraw() メソッドを使用して Circle クラスを追加します。カスタム ビューで、Circle オブジェクトのコレクションを作成し、2 つの円を追加します。カスタム ビューの onDraw メソッドで、各円の onDraw を呼び出します。

class Circle(){

   int mX;
   int mY;
   int mRadius;
   int mColour;

   void Circle(int x, int y, int radius, int Colour){
       this.mX = x;
       this.mY = y;
       this.mRadius = radius;
       this.mColour = colour;
   }

   void onDraw(Canvas canvas){
       canvas.drawCircle(this.mX, this.mY, this.mRadius, getGradient(this.mColour));
   }

}

あなたの見解では:

@Override
protected void onDraw(Canvas canvas) {
    super.onDraw(canvas); 

    for (Circle circle:circles){
        circle.onDraw(canvas);
    }

    rectF.set(getWidth()/2- mRadius2, getHeight()/2 - mRadius2, getWidth()/2 + mRadius2, getHeight()/2 + mRadius2);

 /*draw the arc*/
    canvas.drawArc(rectF, 180, this.getSweepAngle(), true,p);
    invalidate();
}
于 2012-10-29T18:07:20.587 に答える