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);
Другие вопросы по тегам