2012-10-29 68 views
0

如何緩衝用drawCircle畫布方法繪製的圓?在onDraw()方法中緩衝畫布

我需要繪製兩個圓圈,然後是用戶在圓圈上掃動他的手指時的圓弧。 所以,這兩個圓將始終相同,但角度(由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(); 
    } 

回答

1

使用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(); 
} 
+0

與您的代碼,我會畫的圓圈每次onDraw事件被觸發。難道沒有辦法只保留圈子的背景?我的意思是,沒有每次都繪製它們? –

+0

您可以創建一個位圖,將圓圈繪製到位圖上,然後將位圖繪製到畫布上。請記住,畫布只是您的繪畫調用的商店。這不是你畫的表面。 – Simon

0

您可以創建具有相同大小的畫布上的位圖,並繪製圓入位。您可以使用canvas.drawBitmap()在畫布中恢復圓角。

但是,只有在畫布中繪製出複雜或沉重的形狀時,才能證明這一點。對於兩個圈子,我不確定你會有什麼改進。

先用圓圈準備的位圖:

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

問候