how to build a GUI/HUD over top a glSurfaceView in android

匿名 (未验证) 提交于 2019-12-03 02:23:02

问题:

I have an glSurfaceView that looks like this:

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      }

In my main Activity I am adding it to the view like so:

    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();                  }             });

Problem is the glSurfaceView appears at the very top level, covering the imageView but still allowing the user to click on the imageView. How can i get the ImageView to stay at the top of the View like a HUD or GUI

回答1:

After almost a year I came back to this and found the following solution to work like a charm.. I know many have battled with this same issue so I thought I'd share to save anyone the aggravation I endured.

Simple: before adding my views to the frame layout I set the glView's zOrderMediaOverlay to TRUE like so:

glView.setZOrderMediaOverlay(true); rel.addView(camPreview, camParams); rel.addView(glView, glParams); rel.addView(imageView, imageParams);


标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!