首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >如何在安卓摄像头使用的SurfaceView上绘制叠加层?

如何在安卓摄像头使用的SurfaceView上绘制叠加层?
EN

Stack Overflow用户
提问于 2010-05-29 13:05:24
回答 2查看 101.5K关注 0票数 72

我有一个简单的程序,可以将Camera的预览绘制到SurfaceView中。我正在尝试做的是使用onPreviewFrame方法,每次在SurfaceView中绘制新的帧时都会调用该方法,以便执行invalidate方法,该方法应该调用onDraw方法。实际上,正在调用onDraw方法,但没有打印任何内容(我猜相机预览覆盖了我试图绘制的文本)。

这是我的SurfaceView子类的简化版本:

代码语言:javascript
复制
public class Superficie extends SurfaceView implements SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 public Camera camera;
 Superficie(Context context) {
  super(context);
  mHolder = getHolder();
  mHolder.addCallback(this);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 public void surfaceCreated(final SurfaceHolder holder) {
  camera = Camera.open();
  try {
   camera.setPreviewDisplay(holder);
   camera.setPreviewCallback(new PreviewCallback() {
    public void onPreviewFrame(byte[] data, Camera arg1) {
     invalidar();
    }
   });
  } catch (IOException e) {}
 }
 public void invalidar(){
  invalidate();
 }
 public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) {
  Camera.Parameters parameters = camera.getParameters();
  parameters.setPreviewSize(w, h);
  camera.setParameters(parameters);
  camera.startPreview();
 }
 @Override
 public void draw(Canvas canvas) {
  super.draw(canvas);
  // nothing gets drawn :(
  Paint p = new Paint(Color.RED);
  canvas.drawText("PREVIEW", canvas.getWidth() / 2,
    canvas.getHeight() / 2, p);
 }
}
EN

回答 2

Stack Overflow用户

发布于 2013-05-16 23:04:35

尝试从surfaceCreated调用setWillNotDraw(false)

代码语言:javascript
复制
public void surfaceCreated(SurfaceHolder holder) {
    try {
        setWillNotDraw(false); 
        mycam.setPreviewDisplay(holder);
        mycam.startPreview();
    } catch (Exception e) {
        e.printStackTrace();
        Log.d(TAG,"Surface not created");
    }
}

@Override
protected void onDraw(Canvas canvas) {

    canvas.drawRect(area, rectanglePaint);
    Log.w(this.getClass().getName(), "On Draw Called");
}

并从onTouchEvent调用invalidate

代码语言:javascript
复制
public boolean onTouch(View v, MotionEvent event) {

    invalidate();
    return true;
}
票数 17
EN

Stack Overflow用户

发布于 2011-09-20 16:04:47

我认为在使用surfaceView的draw方法执行任何操作之前,应该先调用super.draw()方法。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/2933882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档