Android ImageView 覆盖 Opengl ES 意外行为

标签 android opengl-es overlay android-canvas

我正在尝试向 Android opengl ES 应用程序添加叠加层,目前正在指定一个 ImageView 并使用 SurfaceViewOverlay API 演示中的代码,有效地合并我编写的两个应用程序,一个基于 Canvas ,一个使用 opengl ES .

由于合并两个项目,涉及大量的复制粘贴,这导致我不小心使用了空表面支架。令人惊讶的是,这有效但引发了大量警告。然而,将其更改为 opengl 面板的表面支架会导致应用程序挂起并且不显示来自 opengl 或 ImageView 的内容。

我尝试了代码以确保我没有在任何地方初始化任何其他东西,并确认了 HTC Desire 和 Samsung Galaxy(均运行 2.2)上的行为

Canvas c = null;
SurfaceHolder surfaceHolder2D = null; // this works but throws occational Null Pointer exceptions on the first canvas.drawText
//SurfaceHolder surfaceHolder2D = rsurfaceHolder; // this locks the application. 
//rsurfaceHolder is initialized with getHolder() in the opengl class and this worked with both when they where separate. 
//The change to ImageView was to get around issues with multiple SurfaceViews in an application having indeterminate Z order

try
{
    if (Global.RUNNING == 1)
    {
        c = surfaceHolder2D.lockCanvas(null); // when canvas is null this line can be ommited and it still works
        synchronized (surfaceHolder2D)
        {
            rpanel2D.onDraw(c);
        }
    }
    else
        sleep(1000);
}
catch (Exception e)
{
    e.printStackTrace();
}
finally
{
    if (c != null)
    {
        surfaceHolder2D.unlockCanvasAndPost(c);
    }
}

那么到底发生了什么,执行此操作的正确方法是什么?我假设当我写入一个空 Canvas 时,编译器正在做一些事情并将它发送到正确的位置,而不管。

保持原样,并不是一个真正的选择,出于多种原因,包括不相信这会在多个版本的 android 上工作,它会用持续不断的警告流淹没日志,帧速率会显着下降,而且它只能工作如果 onDraw 在每次调用时都无效。

至于 onDraw 函数,这只是使用带有 this.invalidate() 的 canvas.drawText

好奇地创建一个新的 Canvas 并向其绘制并尝试使 setImageResource 无效或使用(使用新的或 null)抛出“CalledFromWrongThreadException:只有创建 View 层次结构的原始线程才能触及其 View ”但在绘制时不会到空 Canvas 。作为回应,我将其移至从 openGL 线程调用,但是尽管这工作了几秒钟,但在 ImageView 停止更新后不久。它仍在调用,因为我放置在那里的计数器确认它已增加,即使显示没有增加。隐藏和取消隐藏叠加层会导致它再次工作几秒钟。

如有任何帮助,我们将不胜感激。如果我完全走错了路,请告诉我。我的替代方案是将其渲染为 BMP,创建一个新纹理并将其绘制为四边形,但我想这会导致一分钟创建数千个纹理的问题。

提前致谢。 -K

最佳答案

我不确定您要实现什么 - 如果两个渲染都使用 OpenGL 完成不是更好吗?假设没有其他办法,我建议创建一个 FrameLayout并向其中添加两个 View (GLSurfaceViewImageView)。如果您需要更改 UI 元素,则必须从 UI 线程进行更改,从 GL 线程更改元素会导致错误;所以一定要在里面做任何改变runOnUiThread可运行。

关于Android ImageView 覆盖 Opengl ES 意外行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6977051/

相关文章:

java - 基于数组 contains 和 orderby 查询 firestore

html - 在嵌入式视频上叠加透明背景

swing - 如何在矩形上创建和分布对角条纹?

Android - Fragment 中的 GlSurfaceView 同时运行两次

iphone - OpenGL ES-全局上下文错误中的限定符

ios - 在条形码扫描仪应用程序 (Swift 3) 中的相机 View 上添加对象

android - 由于多个 APK 版本,无法在 App Billing V3 中为 Android 生成公钥

android - 在 android 应用程序中进行服务器通信的后台服务的最佳方式

android - SAPI 可以在 Android 上运行吗?

opengl - OpenGL over Windows Remote 的当前状态和解决方案