我正在将我的应用程序从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上运行,因此它也必须在此设备上运行。我只是不知道如何。
答案 0 :(得分:0)
为了记录,我可以通过在原生方面调用EGL_RED_SIZE
时将EGL_GREEN_SIZE
,EGL_BLUE_SIZE
和eglChooseConfig()
设置为8来解决此问题。