SurfaceView拒绝为我创建一个32位曲面

时间:2018-04-03 14:36:42

标签: android android-ndk

我正在将我的应用程序从NativeActivity移开,因为我想在Java端做更多的事情而在C中做更少的事情。但是,我仍然希望将渲染器保留在C.这就是我为什么的原因使用Activity作为主视图。{/ p>

当我使用SurfaceView时,NativeActivity返回了ANativeWindow_getFormat(),这很好。但是,根据RGBX_8888我的新渲染器,我的SurfaceView回调始终会收到surfaceChanged()作为像素格式看起来非常难看,因为它只有65536种颜色,渐变看起来相当便宜16位。

因此,在调用RGB_565之前,我尝试将以下代码添加到我的活动onCreate()中:

setContentView()

这确实解决了我的运行Android 8的Nexus 5X设备上的问题,但是在运行Android 7的Nexus 9平板电脑上,它无法正常工作,我仍然可以获得16位表面。

然而,让我感到困惑的是,当我在运行Android 7的Nexus 9平板电脑上使用getWindow().setFormat(PixelFormat.RGBX_8888); 时,实际上得到了 NativeActivity曲面!所以这肯定是对Nexus 9 / Android 7的硬件/系统限制。它适用于RGBX_8888,但不适用于我的NativeActivity

更令人困惑的是,在查看Android源代码时,您可以看到SurfaceView实际上明确请求NativeActivity RGB_565中的onCreate,但当我在Nexus 9 / Android 7上拨打RGBX_8888时,我仍然得到ANativeWindow_getFormat()。这对我来说当然很好但当然这让我想知道RGBX_8888表面实际来自哪里因为NativeActivity要求RGB_565表面。

简而言之:基本上,我需要知道的是我如何强迫SurfaceView在我的Nexus 9 / Android 7上使用RGBX_8888表面。在我的Nexus 5X /上Android 8上面显示的代码可以解决问题,但它不适用于Nexus 9.但由于NativeActivity可以在Nexus 9上运行,因此它也必须在此设备上运行。我只是不知道如何。

1 个答案:

答案 0 :(得分:0)

为了记录,我可以通过在原生方面调用EGL_RED_SIZE时将EGL_GREEN_SIZEEGL_BLUE_SIZEeglChooseConfig()设置为8来解决此问题。