在项目中,有时候需要将视频显示在GLSurfaceView之上, 目前我的方法是:
解决方案一:
在GLSurfaceView.Renderer中,将onDrawFrame函数中画物体的操作全部屏蔽掉。
在这里我使用一个变量bRendeFlag 来控制的。
@Override public void onDrawFrame(GL10 gl) { // TODO Auto-generated method stub //System.out.println("MySurfaceView onDrawFrame ==="); //采用平滑着色 gl.glShadeModel(GL10.GL_SMOOTH); //设置为打开背面剪裁 gl.glEnable(GL10.GL_CULL_FACE); //清除颜色缓存于深度缓存 gl.glClear(GL10.GL_COLOR_BUFFER_BIT | GL10.GL_DEPTH_BUFFER_BIT); //设置当前矩阵为模式矩阵 gl.glMatrixMode(GL10.GL_MODELVIEW); //设置当前矩阵为单位矩阵 gl.glLoadIdentity(); // 在3D空间绘制等级图片 gl.glMatrixMode(GL10.GL_MODELVIEW); gl.glLoadIdentity(); //开启混合 gl.glEnable(GL10.GL_BLEND); //设置源混合因子与目标混合因子 gl.glBlendFunc(GL10.GL_SRC_ALPHA, GL10.GL_ONE_MINUS_SRC_ALPHA); if(bRendeFlag == true){ levelSurface.draw(gl); singerSurface.draw(gl); } //禁止混合 gl.glDisable(GL10.GL_BLEND); }
这种方法不是很现实,因为也许我们在播放视频的同时也想刷新界面的话。
解决方案二:
将GLSurfaceView的渲染模式设置为: 非主动渲染(RENDERMODE_WHEN_DIRTY)。
// 设置为主动渲染. public void setRenderModeAuto(){ setRenderMode(GLSurfaceView.RENDERMODE_CONTINUOUSLY); } // 设置为非主动渲染. public void setRenderModeDirty(){ setRenderMode(GLSurfaceView.RENDERMODE_WHEN_DIRTY); }
这样3D层就不会主动去刷新,Video就能显示出来了。
解决方案三:
将VideoView置到Top层:
tVideoView.setZOrderOnTop(true);
第三个方案,我失败了,不过理论上应该是可行的,可能是我程序内部还有点小问题。
本文博客源地址:http://blog.csdn.net/ypist