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

36

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

Подумав немного, я понял, что этоshould работать более или менее так:

actual drawing of "everything" occurs after onResume() in "free" time parts of the screen can be redrawn but only those that were invalidated (and everything underneath)

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

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

Например. от того, кто использует

lastClicked.setImageBitmap();

или же

lastClicked.setImageResource();

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

Ваш Ответ

4   ответа
66

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

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

чтобы завершить этот ответ, я бы сказал, что много раз важно проверять код различного метода, который вы можете использовать в виджете, чтобы понять, когда происходит недействительный вызов, и реализовать макет, чтобы свести их к минимуму. например, если у вас сложный макет, то один TextView с wrap_content всегда будет выводить из строя () весь ваш макет в конце каждого вызова setText (), с другой стороны, если вам удастся получить фиксированное измерение только текст внутри представления будет изменен в результате гораздо более плавного графического интерфейса.
20

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

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

Некоторые исправляют предложения, но неверный подход. !! -1
0

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

0

Мой код был

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

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

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

Похожие вопросы