【问题标题】:SurfaceView on Android 2.3.6 doesn't render full regionAndroid 2.3.6 上的 SurfaceView 不呈现完整区域
【发布时间】:2015-05-10 22:31:31
【问题描述】:

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

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

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

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

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

这种情况仅发生在带有 2.3.6 且 ROM 来自 https://developers.google.com/android/nexus/images (2.3.6 (GRK39F)) 的 Nexus S 上。 4.0.4的同一个设备没有这个bug。

在带有 2.3.6 的三星 Ace-2 上运行良好。也可以在更高版本的 android 上完美运行。

有人见过这样的错误吗?很确定这是该特定手机上的错误。有什么建议可以解决这个问题吗?

【问题讨论】:

  • 我不会真正关注 Android 2.3.6 了。它仅占所有 Android 设备的 6% 左右:developer.android.com/about/dashboards/index.html
  • 对于我的应用统计数据有点不同。我在 2.3.6 上仍有 24% 的用户。但是,不确定其中有多少人拥有 Nexus S。
  • 好吧,我只是提醒你一下,以防这是较新的项目。

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


【解决方案1】:

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

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

【讨论】:

  • adb shell dumpsys SurfaceFlinger 的输出在这些情况下通常很有帮助。图形架构文档通过硬件作曲家摘要的示例 - source.android.com/devices/graphics/…
  • 谢谢!这真的很有帮助。将检查dumpsys
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-07-12
  • 1970-01-01
  • 1970-01-01
  • 2017-04-19
  • 1970-01-01
相关资源
最近更新 更多