最近公司产品要加一个视频的功能,所以撸的surfaceView方面的代码比较多。
昨天遇到一个问题,我把视频所在的Activity的背景设置为透明,那么surfaceView视图的背景也变成透明了。但是需求中需要背景为黑色,以实现那些信息提示的显示。
实行的方法:
1.将surfaceview的父容器的背景设置为黑色。
结果: 没用,还是透明的,查阅资料得知,surfaceView会在当前的activity布局上挖一个洞,这个洞是一直到你父布局的底层的,所以说不管你在surfaceview上设置几个父容器,最后surfaceview那块的背景都跟activity的背景一样。
2.给surfaceview设置背景,并添加 surfacview.setZOrderOnTop(true);这个属性。
结果:成功,surfaceview绘制的内容在Z轴上放在顶层而且surfaceview也成功加上了黑色的背景,但是引出了另外一个问题,在surfaceview所在视图区域的其他控件全部被他的画布给遮住了。所以这个方案也没有能解决掉问题。
3.在surfaceView第一次生成的时候,用canvas给surfaceView手动绘制一层背景
结果:成功了,但是这种方法要注意的是只能在第一次生成surfaceview的时候去绘制,不然多次绘制,那么就会覆盖掉你原本要在surfaceview上绘制的内容了(我的项目中,surfaceview 得多次重复使用)
下面是我最后使用的代码:
surfaceView.getHolder().addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
if (needPaint) {
needPaint = false;
Canvas canvas = holder.lockCanvas();
canvas.drawColor(Color.BLACK);
holder.unlockCanvasAndPost(canvas);
}
}
@Oerride
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { }
@Override
public void surfaceDestroyed(SurfaceHolder holder) { }
});
有问题欢迎交流,欢迎指正。