Создание круга с 4 сегментами, используя холст в Android с вращением
Мне нужно создать сегментированный круг с четырьмя случайными цветами, как это:
http://vectips.com/wp-content/uploads/2015/04/39.png. "4 сегмента по кругу"
Я сделал следующий код, ссылаясь на документацию по Android об использовании canvas.drawArc(), но это не соответствует моим ожиданиям, поскольку показывает только один сегмент.
Bitmap bitMap = Bitmap.createBitmap(100, 100, Bitmap.Config.ARGB_8888);
bitMap = bitMap.copy(bitMap.getConfig(), true);
// Construct a canvas with the specified bitmap to draw into
Canvas canvas = new Canvas(bitMap);
// Create a new paint with default settings.
Paint paint = new Paint();
// smooths out the edges of what is being drawn
paint.setAntiAlias(true);
// set color
paint.setColor(Color.BLUE);
paint.setStrokeWidth(4.5f);
RectF oval = new RectF(200F, 200F, 450F, 450F);
paint.setStyle(Paint.Style.FILL);
canvas.drawArc(oval, 0F, 90F, true, paint);
paint.setColor(Color.GREEN);
canvas.drawArc(oval, 90F, 90F, true, paint);
paint.setColor(Color.RED);
canvas.drawArc(oval, 180F, 90F, true, paint);
paint.setColor(Color.BLACK);
canvas.drawArc(oval, 270F, 90F, true, paint);
imageView.setImageBitmap(bitMap);
1 ответ
Решение
Ваши углы дуги неправильны. Смотрите ссылку на drawArc Canvas, аргументы угла такие:
startAngle - начальный угол (в градусах), где начинается дуга
sweepAngle - угол поворота (в градусах), измеренный по часовой стрелке
Ваша последняя дуга охватывает все предыдущие. Вы должны сделать что-то вроде (код Kotlin ниже):
private val oval = RectF(200F, 200F, 450F, 450F)
private val paint = Paint()
override fun onDraw(canvas: Canvas) {
paint.style = Paint.Style.FILL
paint.color = Color.BLACK
canvas.drawArc(oval, 0F, 90F, true, paint)
paint.color = Color.BLUE
canvas.drawArc(oval, 90F, 90F, true, paint)
paint.color = Color.RED
canvas.drawArc(oval, 180F, 90F, true, paint)
paint.color = Color.GREEN
canvas.drawArc(oval, 270F, 90F, true, paint)
}
Нарисует что-то вроде:
Версия Java:
private RectF oval = new RectF(0F,0F,100F,100F);
private Paint paint = new Paint();
@Override
protected void onDraw(Canvas canvas) {
paint.setStyle(Paint.Style.FILL);
paint.setColor(Color.BLACK);
canvas.drawArc(oval, 0F, 90F, true, paint);
paint.setColor(Color.BLUE);
canvas.drawArc(oval, 90F, 1800F, true, paint)
paint.setColor(Color.RED);
canvas.drawArc(oval, 0F, 190F, true, paint)
paint.setColor(Color.GREEN);
canvas.drawArc(oval, 270F, 360F, true, paint)
}