Создание круга с 4 сегментами, используя холст в Android с вращением - PullRequest
0 голосов
/ 15 февраля 2019

Мне нужно создать сегментированный круг с четырьмя случайными цветами, подобными этому:

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 Ответ

0 голосов
/ 15 февраля 2019

Ваши углы дуги неправильны.См. DrawArc Ссылка на холст , аргументы угла такие:

  • 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)
}

Нарисует что-то вроде:

Sample output

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)
  }
...