Android View.invalidate(Rect) различное поведение между двумя устройствами
У меня есть пользовательское представление (форма волны), которое необходимо синхронизировать с прогрессом медиаплеера. Проблема в том, что у меня другое поведение при использовании invalidate(Rect). Вот код, который выполняет обновление в моем пользовательском представлении:
public void setProgress(int currentDuration) {
// ... Some code to calculate the dirty width
invalidate(mDirtyWidth,0,mDirtyWidth+ mDirtyWidthRegion, viewHeight);
}
Это отлично работает на Samsung Galaxy 4 (Android 4.4.2). Снимок экрана с включенным "Показать обновления просмотра GPU"
Но в Nexus 7 (Android 5.1) весь вид становится недействительным каждый раз:
1 ответ
После Android 5.0 холст clipBounds всегда является границами вашего представления с hardwareAccelerated, грязный прямоугольник invalidate(dirty rect) игнорируется
5.0 ViewRootImpl.java http://grepcode.com/file/repository.grepcode.com/java/ext/com.google.android/android/5.0.0_r1/android/view/ViewRootImpl.java/
dirty.setEmpty();
mBlockResizeBuffer = false;
mAttachInfo.mHardwareRenderer.draw(mView, mAttachInfo, this);
4.4 ViewRootImpl.java http://grepcode.com/file_/repository.grepcode.com/java/ext/com.google.android/android/4.4.2_r1/android/view/ViewRootImpl.java/?v=source
mCurrentDirty.set(dirty);
dirty.setEmpty();
attachInfo.mHardwareRenderer.draw(mView, attachInfo, this,
animating ? null : mCurrentDirty);