android SurfaceHolder.lockCanvas返回空值

android SurfaceHolder.lockCanvas返回空值,android,observers,surfaceholder,Android,Observers,Surfaceholder,我一直在尝试在观测者回调中进行绘制,当我尝试锁定画布时,总是得到一个null返回。浮雕看起来不错。我添加了一个SurfaceHolder回调,它会在游戏的早期被调用 以下是我的观察者更新方法: // implements Observer public void update(Observable observable, Object data) { Canvas c = null; Log.i(TAG, "Surface Observer of CbSurfaceState thr

我一直在尝试在观测者回调中进行绘制,当我尝试锁定画布时,总是得到一个null返回。浮雕看起来不错。我添加了一个SurfaceHolder回调,它会在游戏的早期被调用

以下是我的观察者更新方法:

// implements Observer
public void update(Observable observable, Object data) {
   Canvas c = null;
   Log.i(TAG, "Surface Observer of CbSurfaceState thread: "
         + Thread.currentThread().getName());
   try {
      synchronized(mCbHolder) {
         c = mCbHolder.lockCanvas(null);
         if(c == null) {
             Log.i(TAG, "lockCanvas returned null");
          } else {
             doDraw(c);
          }
       }
    } finally {
       // do this in a finally so that if an exception is thrown
       // during the above, we don't leave the Surface in an
       // inconsistent state
       if (c != null) {
          mCbHolder.unlockCanvasAndPost(c);
       }
    }
}
这里是我在初始化中第一次使用它的地方:

public void initCbSurfaceView(Context context) {
   mContext = context;
   // register our interest in hearing about changes to our surface
   mCbHolder = getHolder();
   Log.i(TAG,"got holder");
   mCbHolder.addCallback(cbSurfaceHolderCallback);
   Log.i(TAG,"added callback");
   // initially in preview mode
   mCbHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
   // previewHolder.(SurfaceHolder); Don't know how to replace, but it
   // won't work without the above.
   ...
   mCbSurfaceState.addObserver(this);
   Log.i(TAG, "Creation of CbSurfaceState thread: "
         + Thread.currentThread().getName());
}
我甚至在创建曲面时再次设置它(我最近添加了它以确保)

这是一些日志。我打印线程是因为最初它是从异步线程开始的,我设法避免了这一点:

02-24 20:31:10.380: I/CbSurfaceView(4013): In surfaceCreated callback

02-24 20:31:10.380: I/CbSurfaceView(4013): SurfaceChanged 854X404

02-24 20:31:10.380: I/CbSurfaceView(4013): initPreview width 854 height 404

...

02-24 20:31:25.974: I/CbTouchListener(4013): onTouch Down x 665.7714 y 194.92023

02-24 20:31:25.974: I/CbSurfaceView(4013): Surface Observer of CbSurfaceState thread: main

02-24 20:31:25.981: I/CbSurfaceView(4013): lockCanvas returned null

02-24 20:31:26.005: I/CbSurfaceView(4013): Surface Observer of CbSurfaceState thread: main

02-24 20:31:26.075: I/CbSurfaceView(4013): lockCanvas returned null
我到底做错了什么?我的doDraw一直在工作,直到它开始尝试绘制位图。然后我想从lockCanvas中检查null

我在这里找到了答案 看来你不能在预览图上画图。我得到了一个关于PUSH_缓冲区类型曲面的异常,所以我将它重置为正常,这样它就不会抱怨了。我无法锁定预览的表面,如果它不正常,它将抛出异常。显然,您无法动态更改曲面类型。这可能就是为什么不推荐使用它的原因,但是除非将相机预览设置为PUSH_BUFFER,否则它将无法工作。我将在顶部添加另一个非曲面视图,用于绘制和渲染拍摄的照片


感谢您的关注,我希望这对其他人有所帮助。

让玩具在没有任何参数的情况下尝试lockCanvas()。我怀疑既然你给了它一个空的矩形,它就决定了你不想做任何画画。是的,我检查了我的两个矩形是否都是我想要的,但在我在lockCanvas上添加了空的检查之后,我甚至都没能到达那里。
02-24 20:31:10.380: I/CbSurfaceView(4013): In surfaceCreated callback

02-24 20:31:10.380: I/CbSurfaceView(4013): SurfaceChanged 854X404

02-24 20:31:10.380: I/CbSurfaceView(4013): initPreview width 854 height 404

...

02-24 20:31:25.974: I/CbTouchListener(4013): onTouch Down x 665.7714 y 194.92023

02-24 20:31:25.974: I/CbSurfaceView(4013): Surface Observer of CbSurfaceState thread: main

02-24 20:31:25.981: I/CbSurfaceView(4013): lockCanvas returned null

02-24 20:31:26.005: I/CbSurfaceView(4013): Surface Observer of CbSurfaceState thread: main

02-24 20:31:26.075: I/CbSurfaceView(4013): lockCanvas returned null