SurfaceView на Android 2.3.6 не отображает весь регион

В моем приложении я создаю SurfaceView и использовать его из NDK с помощью API-интерфейса ANativeWindow: ANativeWindow_lock а потом ANativeWindow_unlockAndPost,

Размер поверхности задается ANativeWindow_setBuffersGeometry до 320х480. Размер экрана больше - 480х800.

SurfaceView растягивается с помощью LayoutParams почти до полного экрана.

Проблема, которую я вижу, состоит в том, что мои кадры обновляются только в области 320x480.

Скриншот

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

Это происходит только на Nexus S с 2.3.6 с ПЗУ от https://developers.google.com/android/nexus/images (2.3.6 (GRK39F)). На том же устройстве с 4.0.4 такой ошибки нет.

Отлично работает на Samsung Ace-2 с 2.3.6. Также отлично работает на более высоких версиях Android.

Кто-нибудь видел такой баг? Уверен, что это ошибка на данном телефоне. Любые предложения, как обойти это?

1 ответ

Решение

После небольшой отладки и чтения исходного кода SurfaceView я нашел решение. По-видимому, ANativeWindow_setBuffersGeometry недостаточно, и размер должен быть также установлен из Java. Это помогло мне:

public void surfaceCreated(SurfaceHolder holder) { holder.setFixedSize(BuildConfig.VIDEO_WIDTH, BuildConfig.VIDEO_HEIGHT); }

Другие вопросы по тегам