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);
}
在我的应用程序中,我创建了 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);
}