【Android开发学习39】VideoView在GLSurfaceView之上显示的解决方案
16lz
2021-01-22
在项目中,有时候需要将视频显示在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
更多相关文章
- Android 3.2 以上转屏,切换屏幕,横竖屏(onConfigurationChanged)会
- 王家林最受欢迎的一站式云计算大数据和移动互联网解决方案课程 V
- 在网页程序或Java程序中调用接口实现短信猫收发短信的解决方案
- javascript(六)js事件绑定浏览器兼容解决方案 attachEvent addEve
- java中多线程安全问题产生&解决方案——同步方法