原本只是想给surfaceview添加一个背景图,在xml属性里set了 android:backgrand 属性后,surfaceview的绘图失效了(其实是被覆盖了)。
网上的普遍解决方案是
- sfv.setZOrderOnTop(true); // 这句不能少
- sfv.getHolder().setFormat(PixelFormat.TRANSPARENT);
虽然能解决问题,但是同时也衍生了新的问题。surfaceview会置于最顶层,采取framelayout布局且与surfaceview处于同一个区域的组件会被遮挡掉。
经过试验,surfaceview第一次被创建时,在回调方法中对其设置背景,可以完全达成目的。示例代码片段如下:
//surface回调
surfaceHolder.addCallback(new SurfaceHolder.Callback() {
@Override
public void surfaceCreated(SurfaceHolder holder) {
Canvas canvas = surfaceHolder.lockCanvas();
canvas.drawColor(Color.WHITE);
surfaceHolder.unlockCanvasAndPost(canvas);
}
@Override
public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) {
}
@Override
public void surfaceDestroyed(SurfaceHolder holder) {
timerTask.cancel();
timerTask = null;
}
});