如何在 android 中的 glSurfaceView 之上构建 GUI/HUD

2023-12-03

我有一个glSurfaceView看起来像这样:

public class GLLayer extends GLSurfaceView implements SurfaceHolder.Callback, Camera.PreviewCallback, Renderer {

    private Context context;

    private Circle cRing;
    private CompassNeedle cNeedle;

    private MarkerNorth mNorth;
    private MarkerEast mEast;
    private MarkerSouth mSouth;
    private MarkerWest mWest;
    private MarkerSouthWest mSWest;
    private MarkerSouthEast mSEast;
    private MarkerNorthWest mNWest;
    private MarkerNorthEast mNEast;
    private MarkerWest mGod;
    private MarkerCustom userTag;
    ArrayList <MarkerCustom> locationTags;

    private PhoneOrientation phoneOri;
    private boolean randomSelection[][][]=new boolean[10][10][10];
    ArrayList<double[]> tags = new ArrayList<double[]>();
    double tempOr[] = new double[3];
    ARLaunch _parent;

    RelativeLayout rel;

    public GLLayer(Context context, int orientation, ArrayList<MarkerCustom> custMarkers,ARLaunch parent) {
        super(context);

        locationTags = custMarkers;
        _parent = parent;

        this.context = context;

        this.mGod = new MarkerWest();
        this.cRing = new Circle();
        this.cNeedle = new CompassNeedle();

        this.mNorth = new MarkerNorth();
        this.mEast = new MarkerEast();
        this.mSouth = new MarkerSouth();
        this.mWest = new MarkerWest();

        this.mSWest = new MarkerSouthWest();
        this.mSEast = new MarkerSouthEast();
        this.mNWest = new MarkerNorthWest();
        this.mNEast = new MarkerNorthEast();

        phoneOri=new PhoneOrientation(context); // sensor manager and interpreter

        // settings for translucent glView
        this.setEGLConfigChooser(8, 8, 8, 8, 16, 0);
        this.getHolder().setFormat(PixelFormat.TRANSLUCENT);

        // set render to inline 
        this.setRenderer(this);

        phoneOri.start(context, orientation);


    }

    @Override
    public void onDrawFrame(GL10 gl) {

        gl.glEnable(GL10.GL_TEXTURE_2D);

        // clear Screen and Depth Buffer
        gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT);

        // Reset the Modelview Matrix
        gl.glLoadIdentity();

        //GLU.gluLookAt(gl, eyeX, eyeY, eyeZ, centerX, centerY, centerZ, upX, upY, upZ);
        GLU.gluLookAt(gl,0, 0, 0, 0, 0, 0, 0, 0, 0);

        float floatMat[]=phoneOri.getMatrix();

        gl.glMatrixMode(GL10.GL_MODELVIEW);


        gl.glLoadMatrixf(floatMat, 1);
        //ArrayList<Square[]> squares = new ArrayList<Square[]>();


        gl.glPushMatrix();
        gl.glTranslatef(0,0,-10.0f);
        cNeedle.draw(gl);
        gl.glLoadMatrixf(floatMat,0);

        gl.glTranslatef(0,0,10.0f);
        cRing.draw(gl);


        //Draw South
        gl.glTranslatef(0.0f,-150.0f,-10.0f);
        mSouth.draw(gl); 

        //Draw West
        gl.glTranslatef(-150.0f,150.0f,0.0f);
        mWest.draw(gl);

        //DrawNorth
        gl.glTranslatef(150.0f,150.0f,0.0f);
        mNorth.draw(gl); 

        //DrawEast
        gl.glTranslatef(150.0f,-150.0f,0.0f);
        mEast.draw(gl);

        //SW
        gl.glTranslatef(-225.0f, -75.0f, 0.0f);
        mSWest.draw(gl);

        // NW
        gl.glTranslatef(0.0f,150.f,0);
        mNWest.draw(gl);

        gl.glTranslatef(150.0f, 0f, 0f);
        mNEast.draw(gl);

        gl.glTranslatef(0.0f,-150.0f,0.0f);
        mSEast.draw(gl);



         gl.glPushMatrix();


    }

    @Override
    public void onSurfaceChanged(GL10 gl, int width, int height) {
      if(height == 0) {                    //Prevent A Divide By Zero By
        height = 1;                         //Making Height Equal One
        }
        float ratio = (float) width / height;
        gl.glViewport(0, 0, width, height);     //Reset The Current Viewport
        gl.glMatrixMode(GL10.GL_PROJECTION);    //Select The Projection Matrix
        gl.glLoadIdentity();                    //Reset The Projection Matrix
                                                //Calculate The Aspect Ratio Of The Window

        //gl.glFrustumf(-ratio, ratio, -1, 1, 1, 100);
        GLU.gluPerspective(gl, 35.0f, (float)width / (float)height, 5.0f, 200.0f);
        gl.glMatrixMode(GL10.GL_MODELVIEW);     //Select The Modelview Matrix
        gl.glLoadIdentity();                    //Reset The Modelview Matrix

        GLU.gluLookAt(gl, 0, 1.0f, 5.0f, 0, 0, 0, 0, 1.0f, 0);


    }

    @Override
    public void onSurfaceCreated(GL10 gl, EGLConfig arg1) {
        // Load the texture for the square
        //square.loadGLTexture(gl, this.context);

        for(int i=0;i<locationTags.size();i++){
            userTag=locationTags.get(i);
            userTag.loadGLTexture(gl, this.context);
            //Figure out how to load textures for each
        }
        cRing.loadGLTexture(gl, this.context);
        cNeedle.loadGLTexture(gl, this.context);
        mNorth.loadGLTexture(gl, this.context);
        mEast.loadGLTexture(gl, this.context);
        mSouth.loadGLTexture(gl, this.context);
        mWest.loadGLTexture(gl, this.context);
        mSWest.loadGLTexture(gl, this.context);
        mNWest.loadGLTexture(gl, this.context);
        mSEast.loadGLTexture(gl, this.context);
        mNEast.loadGLTexture(gl, this.context);

        gl.glEnable(GL10.GL_TEXTURE_2D);            //Enable Texture Mapping ( NEW )
        gl.glShadeModel(GL10.GL_SMOOTH);            //Enable Smooth Shading
        gl.glClearColor(0.0f, 0.0f, 0.0f, 0.0f);    //Black Background
        gl.glClearDepthf(1.0f);                     //Depth Buffer Setup
        gl.glEnable(GL10.GL_DEPTH_TEST);            //Enables Depth Testing
        gl.glDepthFunc(GL10.GL_LEQUAL);             //The Type Of Depth Testing To Do

        //Really Nice Perspective Calculations
        //gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_NICEST);
        gl.glHint(GL10.GL_PERSPECTIVE_CORRECTION_HINT, GL10.GL_SMOOTH);

    }

    @Override
    public void onPreviewFrame(byte[] data, Camera camera) {
        // TODO Auto-generated method stub

    }

在我的主要活动中,我将其添加到视图中,如下所示:

    setContentView(frame);

                frame.addView(camPreview, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                frame.addView(glView, new LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
                frame.addView(lin);
                lin.addView(rel);

RelativeLayout.LayoutParams pNav = new RelativeLayout.LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT);

            pNav.addRule(RelativeLayout.ALIGN_PARENT_BOTTOM,1);
            pNav.addRule(RelativeLayout.ALIGN_PARENT_RIGHT);
            pNav.rightMargin = 20;


            rel.addView(imageView,pNav);
            lin.bringToFront();
            ;


            imageView.setOnClickListener(new OnClickListener() {

                @Override
                public void onClick(View v) {
                    // TODOn Auto-generated method stub
                    glView.newTag();

                }
            });

问题是glSurfaceView出现在最顶层,覆盖imageView但仍然允许用户单击imageView。我怎样才能让 ImageView 像 HUD 或 GUI 一样停留在视图的顶部


差不多一年后,我回到这个问题,发现以下解决方案非常有效。我知道很多人都在与同样的问题作斗争,所以我想我应该分享一下,以减轻我所忍受的痛苦。

简单:在将视图添加到框架布局之前,我将 glView 的 zOrderMediaOverlay 设置为 TRUE,如下所示:

glView.setZOrderMediaOverlay(true);
rel.addView(camPreview, camParams);
rel.addView(glView, glParams);
rel.addView(imageView, imageParams);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何在 android 中的 glSurfaceView 之上构建 GUI/HUD 的相关文章

  • 检查片段是否存在并重用它

    每次用户单击列表视图中的项目时 我都会使用以下代码创建一个片段 但通过这种方式 片段是在每次用户点击时创建的 我想要的是重用旧片段 如果存在 并仅重新加载其内容 不创建新片段 MagazineViewFragment fragment ne
  • 从主题获取 EditText 的“默认”颜色值

    我有一个Activity其中包含一个EditText关于 3 1 根据用户输入 我更改 EditText 中文本的颜色 红色表示错误 然后在文本正常时将其重置为黑色 其中一个问题涉及改变活动的整体主题 例如 将其从浅色主题更改为常规深色主题
  • Android GooglePlayServicesUtil.getErrorDialog() 不显示对话框

    我正在尝试检查是否可用Google Play 服务 APK在使用它之前 我有一个 软件包已过期的设备 日志显示 Google Play 服务已过时 需要 3225100 但找到 3136134 下面的代码将处理这种情况并显示一个对话框 提示
  • 如何在 ImageButton 上显示文本?

    我有一个ImageButton我想在上面显示文本和图像 但是当我尝试使用模拟器时
  • 如何在导航抽屉上显示谷歌加个人资料图片?

    下面的代码来自github 用于在android应用程序中通过gmail登录 我做了一些修改以使用volley显示个人资料图片 它工作正常 我只想在导航抽屉中显示这些内容 个人资料图片 姓名和电子邮件 ID 我使用了 android stu
  • 如何在无头Linux中更新Android平台工具?

    我们有一些没有安装 X Window 的 CI 主机 我知道如何使用 android 更新命令更新 SDK 但如何使用此命令更新平台工具 您可以使用以下命令 android list sdk android update sdk no ui
  • 如何在Android中创建类似架子的视图?

    如何在android中创建一个类似书架的视图 在任意行中显示多本书 此外 它应该具有像 Moon reader 应用程序那样的水平和垂直功能 我可以编写一个水平移动的架子视图 但它不能完全工作 我使用 xml 文件来查看包含图像 文本和按钮
  • 在 Android Studio 中调试服务的正确方法?

    在 Android Studio 中调试服务有正确的方法吗 或者 Android Studio 无法做到这一点 当我尝试调试时 它只会断开套接字 与目标虚拟机断开连接 地址 localhost 8600 传输 socket 希望你能在这里帮
  • Android view.animate() 第一次执行后工作方式不同且错误

    我已经实现了一个横幅 每当用户失去连接时就会弹出 重新连接后 另一个横幅会显示几秒钟然后消失 布局是一个RelativeLayout 其中一个灰色的TextView 表示警告 一个绿色的TextView 表示重新连接消息 如果我只是更改 V
  • 如何在Android中以编程方式替换视图? [复制]

    这个问题在这里已经有答案了 我有一个复杂的视图 包含多个子视图 例如文本视图和图像视图 我想用另一个 派生的 图像视图替换其中一个图像视图 另一个支持在后台加载图像 如何用新的图像视图替换原始图像视图 我目前的解决方案只是复制粘贴整个 XM
  • 文本末尾有额外的换行符

    使用此方法设置文本后 我似乎得到了一些额外的换行符TextView message setText Html fromHtml message 我怎样才能删除这些 它们导致我的布局扭曲 因为它在输出中添加了两条额外的行 该字符串已通过以下方
  • NanoHTTPD 如何将上传的文件保存到SD卡文件夹

    如何将上传的文件保存到SD卡文件夹 目前它存储到 data data cache文件夹 文件名如 NanoHTTPD 一些随机数 我无法将其复制到 SD 卡中的任何文件夹位置 我想将文件保存到 SD 卡中前面提到的文件夹位置 其名称与从我的
  • 如果使用键盘,如何捕获 TimePicker 中的时间变化?

    我有一个小部件 它是一个 TimePicker 用于检索数据库字段中保存的时间 问题是 当用户更改小部件中的时间值时 这不会保存在数据库中 所以我遇到了setOnTimeChangedListener如果您只在小部件中使用加号和减号 那么该
  • 在 Cordova / PhoneGap 中生成 iOS 和 Android 图标

    我有一个新创建的 Cordova 项目 其中包含以下内容config xml设置 使用来自http docs phonegap com en edge config ref images md html http docs phonegap
  • AndroidPlot:从 1 到 11 的域标签

    我已经在我的应用程序中实现了 AndroidPlot 除了 X 轴标签 从 0 到 10 之外 它工作得很好 我想显示 1 到 11 此外 Y 轴上的标签不会出现 我正在使用的代码 import java text DecimalForma
  • ListPreferences 的异常

    这是我的第一个 Android 应用程序 在尝试使用 ListPreference 时遇到了异常 应用程序与首选项一起加载 但是当我触摸 ListPreference 条目时 应用程序 意外停止 设置 java public class S
  • 使用 Google 语音服务查询支持的语言不适用于 Android 13

    我使用以下命令查询语音服务支持的语言RecognizerIntent ACTION GET LANGUAGE DETAILS action val intent Intent RecognizerIntent ACTION GET LANG
  • 如何使用Android Studio录制Android屏幕?

    我已经在 Mac 上的 Applications 文件夹中安装了 Android Studio 我认为 sdk 位于包内容中 但现在我想使用 AShot jar 录制屏幕以获取应用程序的演示视频 我必须放弃SDK的路径 当我给出我认为正确的
  • 使用 Ant 构建 Android 库项目

    我在使用 ant 构建 Android 库项目时遇到问题 当我尝试跑步时ant release 它说Target release does not exist in the project MyProject 然后我假设库可能无法通过发布
  • 片段已添加 IllegalStateException

    我在容器 Activity 上使用此方法来显示 BFrag public void showBFrag Start a new FragmentTransaction FragmentTransaction fragmentTransact

随机推荐

  • React.js 中所有者和父组件有什么区别

    React 0 13 带来基于父级的上下文而不是基于所有者的上下文 所以 我不太明白所有者组件和父组件之间的区别 示例将不胜感激 var A React createClass render return b b
  • 重新渲染 rich:dataTable 的特定行

    早上好 是否可以仅重新渲染 rich dataTable 的 1 特定行 我有一个 rich dataTable 当我执行某些操作时 我确信只有 1 行发生了更改 我只需要重新渲染这一行 而不是整个表 是否可以 如何 XHTML
  • 使用海龟模块 exitonclick()

    我的代码应该在第一部分之后关闭turtle screen 然后启动另一个屏幕并执行第二部分 但在那里它没有按预期工作 import turtle ws turtle Screen tod 1 turtle Turtle tod 1 colo
  • UIScrollview获取触摸事件

    如何检测我的触摸点UIScrollView 触摸委托方法不起作用 设置点击手势识别器 UITapGestureRecognizer singleTap UITapGestureRecognizer alloc initWithTarget
  • 为什么向量持有一个类类型在push_back()时会再次调用复制构造函数?

    我有以下代码 include
  • Java-切换字符串中的字母大小写

    我有我的代码可以将大小写从上切换到下 反之亦然 我也有它可以从上到下 从下到上切换的位置 我的问题是 有没有办法让它也包含逗号或句点等字符 例如 如果我输入字符串 Hello there 我会得到 你好 那里 你好 那里 和 你好 我怎样才
  • Unity Hololens2 构建错误

    我尝试构建 Hololens 2 应用程序 但遇到无法解决的错误 当我尝试使用 Unity 播放按钮测试应用程序时 它按预期工作 我还尝试了 MRTK 示例场景 它也只能通过播放按钮起作用 但当我尝试构建它时却不起作用 构建错误 Libra
  • 熊猫在索引列上合并? [复制]

    这个问题在这里已经有答案了 In 88 c Out 88 Address Name CustomerID 10 Address for Mike Mike 11 Address for Marcia Marcia In 89 c index
  • 为 javafx textField 添加最多 2 位小数的侦听器

    我想将 javaFX 文本字段设置为小数点后两位 我找到了答案 但它是针对数值的 例如 force the field to be numeric only textField textProperty addListener new Ch
  • 如何更改 UIImagePickerController 中的取消按钮标题?

    目前我正在开发一个多语言应用程序 我想更改Cancel Use and Retake的按钮标题UIImagePickerController 我怎样才能做到这一点 我的问题是通过使用自定义覆盖类解决的 self picker UIImage
  • 如何用日期标记 x 轴?

    我似乎无法弄清楚如何在 Matlab 中绘制不按数字顺序排列的日期 我需要的日期是从 1 月 22 日到 2 月 1 日 但是当我将其放入 Matlab 中时 它从 1 日开始按数字顺序排列 所以我想知道如何获取它 以便它按照我的列表顺序排
  • Google Cast SDK3 Android 示例应用程序在低于 5.0 的设备上崩溃

    我已经尝试过 Google Cast Android 示例应用程序 但对于低于 5 0 的设备会崩溃 有人知道为什么吗 下面是我的崩溃日志 0830 12 38 57 242 E AndroidRuntime 16269 引起 java l
  • 如何从极坐标中的日期时间列中提取日期

    我正在尝试从熊猫转移到极地 但遇到了以下问题 import polars as pl df pl DataFrame integer 1 2 3 date 2010 01 31T23 00 00 00 00 2010 02 01T00 00
  • 批量更改文件扩展名

    简单的问题 IMDU 命令执行 imdu b file imd file raw 并将 file imd 转换为 file raw 我有很多 imd 所以我需要一批 我努力了 for x in imd do imdu b x nx raw
  • jQuery:包含用于搜索多个字符串的选择器

    假设我有 li Mary li li John Mary Dave li li John Dave Mary li li John li 如果我需要找到所有包含 John 和 Mary 的 元素 我将如何构建 jQuery 搜索单个字符串似
  • 在 R 中将 raw 转换为 long?

    我需要读取一个编码长整型的二进制文件 我只举其中一个多头作为例子 don t know a simpler way to create the raw vector z lt writeBin c 8L 208L 59L 233L 106L
  • PHP签入签出系统

    我有 PHP 的基本知识 我正在尝试通过向数据库添加签入时间和签出时间来创建签入和签出系统 报到 session start SESSION inchecken true tijd date H i s query INSERT INTO
  • 使用 R/Selenium 仅查找 Disqus 中最热门的帖子

    首先 我对这篇文章的长度表示歉意 因为我想提供足够的细节来说明我正在尝试做的事情 我正在尝试完善我用 R 编写的抓取应用程序以获取 Disqus 评论 到目前为止 我可以使用各种 RSelenium 功能获取特定页面上的所有评论 我现在想做
  • C# 面板作为 MDI 容器

    在 C 中 我想创建一个具有 MDI 容器属性的面板 即 isMdiContainer true 我尝试过这样的事情 form MDIParent this panel1 但这不起作用 有什么建议么 可以创建一个 MDI 面板并在该面板中显
  • 如何在 android 中的 glSurfaceView 之上构建 GUI/HUD

    我有一个glSurfaceView看起来像这样 public class GLLayer extends GLSurfaceView implements SurfaceHolder Callback Camera PreviewCallb