Буферизация холста в методе onDraw()
Как я могу буферизовать Круг, нарисованный методом холста drawCircle?
Мне нужно нарисовать два круга, а затем дугу, когда пользователь проведет пальцем по кругу. Таким образом, два круга всегда будут одинаковыми, но угол (нарисованный методом 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();
}
2 ответа
Добавьте класс Circle с помощью метода onDraw(). В вашем собственном представлении создайте коллекцию объектов 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();
}
Вы можете создать растровое изображение с таким же размером, как у холста, и нарисовать круги в растровом изображении.
в 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();
}
С уважением