Android 2.3.6 上的 SurfaceView 不呈现整个区域

SurfaceView on Android 2.3.6 doesn't render full region

在我的应用程序中,我创建了 SurfaceView 并使用 ANativeWindow API 从 NDK 使用它:ANativeWindow_lock 然后 ANativeWindow_unlockAndPost.

表面的大小由 ANativeWindow_setBuffersGeometry 设置为 320x480。屏幕尺寸更大 - 480x800。

使用 LayoutParams 将 SurfaceView 拉伸到几乎全屏。

我看到的问题是我的帧仅在 320x480 区域刷新。

仅当顶部有另一个动画视图或我在表面视图上显式调用 postInvalidate 时,表面的另一部分才会刷新。但是,postInvalidate 会延迟工作。

这仅发生在带有 2.3.6 和 https://developers.google.com/android/nexus/images (2.3.6 (GRK39F)) ROM 的 Nexus S 上。 4.0.4同机无此BUG

在 Samsung Ace-2 2.3.6 上运行良好。在更高版本的 android.

上也能完美运行

有人见过这样的bug吗?很确定这是那个特定 phone 上的错误。有什么解决方法的建议吗?

经过一些调试和阅读 SurfaceView 的源代码后,我找到了解决方案。显然, ANativeWindow_setBuffersGeometry 是不够的,大小也应该从 java 开始设置。这对我有帮助:

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