Подтвердить что ты не робот

Когда необходимо выполнить invalidate() в представлении?

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

После небольшого размышления я пришел к пониманию, что он должен работать более или менее следующим образом:

  • фактический рисунок "всего" происходит после onResume()
  • в "свободных" временных частях экрана можно перерисовать, но только те, которые были invalidated (и все под ним)

Следовательно, казалось бы, если я что-то изменил после onResume() (например, в ответ на щелчок кнопки, я должен invalidate() измененный View).

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

например. о том, используется ли

lastClicked.setImageBitmap();

или

lastClicked.setImageResource();

Итак, когда необходимо выполнить invalidate() в представлении и как оно действительно работает?

4b9b3361

Ответ 1

Обычно система обрабатывает изменения размера, скрытия, отображения и тонны других вещей для ваших виджетов автоматически, но иногда имеет проблемы, если базовый буфер для рисованных пикселей или данных резервного копирования изменился или устарел (вы меняете ресурс изображения на изменение вида или необработанного набора данных). Это происходит потому, что ОС не может знать, что данные были изменены определенным образом.

В этих случаях, когда вы имеете дело с рисунком, вы должны сообщить системе, что ее базовые данные не находятся в хорошем состоянии с Widget.invalidate(), и повторный рисунок попадает в очередь на основной поток так же, как вы упомянули, В зависимости от реализации системы и версии Android отслеживание изменений в системе меняется, но то, что я обычно делаю, предполагает, что системные ресурсы (массивы байтов, массивы char, индексы ресурсов, ручное рисование по контексту) не отслеживаются и не нуждаются в недействительным, и все остальное будет обрабатываться системой.

Ответ 2

(подумайте о принятии некоторых ответов)

Как правило, invalidate() означает "перерисовать на экране" и приводит к вызову метода просмотра onDraw(). Поэтому, если что-то меняется и оно должно отражаться на экране, вам нужно позвонить invalidate(). Однако для встроенных виджетах вы редко, если вообще когда-либо, должны сами называть это. Когда вы измените состояние виджета, внутренний код вызовет invalidate() по мере необходимости, и ваши изменения будут отображаться на экране. Например, если вы вызываете TextView.setText(), после выполнения большой внутренней обработки (будет ли текст соответствовать на экране, нужно ли его эллипсировать и т.д.), TextView вызовет invalidate() до возврата setText(). Аналогично для других виджетов.

Если вы реализуете пользовательское представление, вам нужно будет вызвать invalidate() всякий раз, когда изменяется модель подкачки, и вам нужно перерисовать свое представление. Его также можно использовать для создания простых анимаций, где вы меняете состояние, затем вызываете invalidate(), снова меняете состояние и т.д.

Ответ 3

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

Ответ 4

У меня была эта проблема, когда я хотел нарисовать textPaint! Мой код был

    canvas.drawPaint(textPaintNumber)
    canvas.drawText("MyText", 30F, 63F, textPaintNumber)

Я очистил первый ворс и проблема была решена

    canvas.drawText("MyText", 30F, 63F, textPaintNumber)