Canvas.drawArc() ничего не рисует

Я пытаюсь нарисовать дугу для наложения поверх некоторой части существующего круга. Оба моих круга отлично рисуются, но ни мой вызов drawArc(), ни мой вызов drawRect() ничего не делают. Приложение не вылетает, исключений нет. Он просто молча терпит неудачу.

код onDraw():

@Override
protected void onDraw(Canvas canvas) {
    int width = getWidth();
    int height = getHeight();

    int size = (width > height) ? height : width;

    float cx = width / 2;
    float cy = height / 2;
    float radius = size / 2;

    float left = cx - radius;
    float right = cx + radius;
    float top = cy - radius;
    float bottom = cy + radius;

    RectF rect = new RectF(left, top, right, bottom);
    RectF rect2 = new RectF(canvas.getClipBounds());

    Log.d("MyTag", "Left: " + rect.left + "Right: " + rect.right + "Top: " + rect.top + "Bottom: " + rect.bottom);
    Log.d("MyTag", "Left: " + rect2.left + "Right: " + rect2.right + "Top: " + rect2.top + "Bottom: "
            + rect2.bottom);

    canvas.drawCircle(cx, cy, radius, circleRing);//Works
    canvas.drawCircle(cx, cy, radius - barWidth, innerColor);//Works
    canvas.drawArc(rect, 0, angle, true, circleColor);//Doesn't work
    canvas.drawRect(rect, circleColor);//Doesn't work

    super.onDraw(canvas);
}

Я подтвердил, что мой circleColor Paint настроен правильно, и что angle является допустимым значением для дуги.

Мои краски настроены следующим образом в блоке {}, чтобы все конструкторы использовали его:

{
    circleColor = new Paint();
    innerColor = new Paint();
    circleRing = new Paint();

    circleColor.setColor(color.holo_blue_light);
    innerColor.setColor(Color.BLACK);
    circleRing.setColor(Color.GRAY);

    circleColor.setAntiAlias(true);
    innerColor.setAntiAlias(true);
    circleRing.setAntiAlias(true);

    circleColor.setStrokeWidth(50);
    innerColor.setStrokeWidth(5);
    circleRing.setStrokeWidth(5);

    circleColor.setStyle(Paint.Style.FILL);
}

Что я пробовал:

  • Координаты жесткого кодирования
  • Использование красок, используемых кругами
  • Наличие только вызова drawArc() и комментирование остальных рисунков
  • Отключение аппаратного ускорения

Logcat показывает, что мой RectF имеет действительные точки, только верх и низ масштабированы, чтобы сформировать квадрат:

01-25 13:33:39.877: D/MyTag(21612): Left: 0.0 Right: 720.0 Top: 159.0 Bottom: 879.0 //Mine
01-25 13:33:39.877: D/MyTag(21612): Left: 0.0 Right: 720.0 Top: 0.0 Bottom: 1038.0 //Canvas'

Кто-нибудь знает, что может быть причиной этого?


person Raghav Sood    schedule 25.01.2013    source источник
comment
o/ Какой вид вы переопределяете? И что должен делать последний drawRect? Разве это не закрасит все? Я только что попробовал это с некоторыми общими объектами и цветами Paint, и использование первых двух вызовов drawCircle и drawArc, кажется, работает, как и ожидалось, на моем Galaxy Nexus.   -  person Kevin Coppock    schedule 25.01.2013
comment
@kcoppock Хейя: П. Последний drawRect я добавил только в целях отладки. Я по-прежнему вижу оба круга, а не прямоугольник или дугу. Я напрямую расширяю базовый класс android.view.View. Я также использую Galaxy Nexus, но вызов дуги рисования для меня просто игнорируется.   -  person Raghav Sood    schedule 25.01.2013
comment
Также пробовал на Nexus 7. То же отсутствие дуги.   -  person Raghav Sood    schedule 25.01.2013
comment
Хм. Просто любопытно, как настроены ваши Paints? Вот точный код, который я использовал: pastie.org/5853922.   -  person Kevin Coppock    schedule 25.01.2013
comment
@kcoppock Отредактировано красками. Я также нашел решение. Добавление ответа сейчас.   -  person Raghav Sood    schedule 25.01.2013


Ответы (1)


Оказалось, проблема была в линии.

circleColor.setColor(color.holo_blue_light);

В то время как Android SDK определяет это как:

Светлый голографический оттенок синего

Постоянное значение: 17170450 (0x01060012)

Кажется, это недопустимый цвет для моего холста (обратите внимание, что он был добавлен в API 14, и я тестирую его на Android 4.2, поэтому он должен быть доступен для меня). Однако изменение его на использование более... нормального цвета работает нормально:

circleColor.setColor(Color.GREEN);
person Raghav Sood    schedule 25.01.2013
comment
Ах, да, вам придется получить это через Ресурсы, например circleColor.setColor(context.getResources().getColor(android.R.color.holo_blue_light)); - person Kevin Coppock; 25.01.2013
comment
@kcoppock Именно это я и сделал :-) Спасибо за помощь! - person Raghav Sood; 25.01.2013