如何在Android上的Camera使用的SurfaceView上绘制覆盖图?

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


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


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);

 }

}


白板的微信
浏览 834回答 3
3回答

倚天杖

SurfaceViewView在这方面可能不太正常。而是,请执行以下操作:将您SurfaceView放在  FrameLayout或RelativeLayout布局XML文件中,因为这两个都允许在Z轴上堆叠小部件将绘图逻辑移到单独的自定义View类中将自定义View类的实例作为FrameLayout或 的子项添加到布局XML文件中RelativeLayout,但将其显示在SurfaceView这将导致您的自定义View类显示在上方SurfaceView。请参阅此处的示例项目,该示例项目在SurfaceView用于视频播放的上方弹出面板分层。

精慕HU

尝试调用setWillNotDraw(false)来自surfaceCreated:public void surfaceCreated(SurfaceHolder holder) {    try {        setWillNotDraw(false);         mycam.setPreviewDisplay(holder);        mycam.startPreview();    } catch (Exception e) {        e.printStackTrace();        Log.d(TAG,"Surface not created");    }}@Overrideprotected void onDraw(Canvas canvas) {    canvas.drawRect(area, rectanglePaint);    Log.w(this.getClass().getName(), "On Draw Called");}并要求invalidate来自onTouchEvent:public boolean onTouch(View v, MotionEvent event) {    invalidate();    return true;}

皈依舞

我认为您应该super.draw()在SurfaceView的draw方法中执行任何操作之前先调用该方法。
打开App,查看更多内容
随时随地看视频慕课网APP