如何缓冲使用drawCircle canvas方法绘制的圆?
当用户将手指扫到圆圈上时,我需要绘制两个圆圈,然后是圆弧。 因此,两个圆将始终相同,但角度(由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();
}
答案 0 :(得分: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();
}
答案 1 :(得分:0)
您可以创建与画布大小相同的位图,并将圆圈绘制到位图中。
在onDraw()
中使用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();
}
此致