Intereting Posts
Windows 8 – Запуск Eclipse (Java VM не найден) Как я могу изменить свой AndroidManifest, поскольку он упаковывается maven Изменить цвет линии EditText – Android Ошибка: нет такого свойства: GROUP для класса: org.gradle.api.publication.maven.internal.ant.DefaultGroovyMavenDeployer Android: singleline = true не работает для edittext Android RecyclerView: измените файл макета LIST на GRID onOptionItemSelected Как запустить сервис из моего Interactor с использованием шаблона MVP в android? Android – Как показать вертикальную линию на фоне ListView (и в соответствии с высотой строки)? Переименование apk в gradle Как отключить прокрутку GridView в Android? При рисовании вне рамки клипа просмотра с Android: как я могу предотвратить недоразвитие представлений от рисования поверх моего пользовательского представления? Как обновить град в студии Android Запуск ошибки диагностики GTM Дальнейшее понимание setRetainInstance (true) Environment.getExternalStoragePublicDirectory предоставляет внутреннее хранилище

Android: invalidate (грязный)

Похоже, что Android действительно не нравится invalidate (Rect dirty) , который используется для того, чтобы аннулировать только часть холста. Когда я аннулирую часть холста (показано ниже в зеленом цвете) и ToggleButton за пределами холста необходимо перерисовать одновременно, весь регион, показанный красным, стирается! Кажется, что Android просто отменяет все в пределах самого маленького прямоугольника, охватывающего объединение двух регионов, которые нужно перерисовать, даже если один из регионов находится за пределами представления, чье холст я недействителен.

Является ли это стандартным поведением, и если да, то зачем кому-то использовать частичную недействительность?

Введите описание изображения здесь

Solutions Collecting From Web of "Android: invalidate (грязный)"

У Android есть класс под названием ViewRootImpl . Этот класс принадлежит каждому окну, которое вы видите на экране (окно термина здесь немного запутанно, поэтому для этого объяснения окно является макетом основного действия без каких-либо диалогов или всплывающих окон сверху). Этот макет перемещается все время, а это означает, что Android просто ждет, чтобы у него был грязный прямоугольник для этого окна и нарисовал его. Поскольку это окно может содержать много просмотров (кнопки и т. Д.), Оно проходит через все из них и запрашивает каждый из них, нужно ли его перерисовку. Каждый вид возвращает грязный прямоугольник в ViewRootImpl и все эти прямоугольники соединяются с одним большим прямоугольником, который перерисовывается в конце.

Почему это так? Ну, ViewRootImpl просит WindowManagerService для одного Canvas рисовать. Это означает, что все представления в одном окне фактически обмениваются Canvas каждый раз, когда происходит обход.

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

Эта проблема вызвана аппаратным ускорением. Вы должны отключить его в своей деятельности, чтобы использовать invalidate(dirty rect) . Чтобы отключить аппаратное ускорение в вашей активности, откройте файл манифеста и добавьте:

 android:hardwareAccelerated="false" 

Теперь вы можете использовать invalidate(dirty rect) .