Android 2.3.6上的SurfaceView不会呈现完整区域

时间:2015-05-10 22:31:32

标签: android android-ndk surfaceview surfaceholder nexus-s

在我的应用中,我创建var hidden, visibilityChange; if (typeof document.hidden !== "undefined") { hidden = "hidden"; visibilityChange = "visibilitychange"; } else if (typeof document.mozHidden !== "undefined") { hidden = "mozHidden"; visibilityChange = "mozvisibilitychange"; } else if (typeof document.msHidden !== "undefined") { hidden = "msHidden"; visibilityChange = "msvisibilitychange"; } else if (typeof document.webkitHidden !== "undefined") { hidden = "webkitHidden"; visibilityChange = "webkitvisibilitychange"; } function handleVisibilityChange() { if (document[hidden]) { // code hid } else { // code normal } } if (typeof document.addEventListener === "undefined" || typeof hidden === "undefined") { } else { document.addEventListener(visibilityChange, handleVisibilityChange, false); } 并使用ANativeWindow API在NDK中使用它:SurfaceView然后ANativeWindow_lock

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

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

我看到的问题是我的帧只在320x480的范围内刷新。

screenshot

只有在顶部有另一个视图动画或者我在曲面视图上明确调用ANativeWindow_setBuffersGeometry时,才会刷新曲面的另一部分。但是,postInvalidate可以延迟使用。

仅在具有2.3.6的Nexus S上发生https://developers.google.com/android/nexus/images(2.3.6(GRK39F))的ROM。 4.0.4的同一设备没有这个错误。

使用2.3.6在Samsung Ace-2上正常工作。也适用于更高版本的Android。

有没有人见过这样的错误?很确定这是特定手机上的一个错误。有什么建议如何解决这个问题?

1 个答案:

答案 0 :(得分:0)

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

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