为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

白板的微信 2019-10-15 14:06:11
我有一个简单的程序,可将的预览绘制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); }}
查看完整描述

3 回答

?
倚天杖

TA贡献1828条经验 获得超3个赞

SurfaceViewView在这方面可能不太正常。


而是,请执行以下操作:


将您SurfaceView放在  FrameLayout或RelativeLayout布局XML文件中,因为这两个都允许在Z轴上堆叠小部件

将绘图逻辑移到单独的自定义View类中

将自定义View类的实例作为FrameLayout或 的子项添加到布局XML文件中RelativeLayout,但将其显示在SurfaceView

这将导致您的自定义View类显示在上方SurfaceView。


请参阅此处的示例项目,该示例项目在SurfaceView用于视频播放的上方弹出面板分层。


查看完整回答
反对 回复 2019-10-15
?
精慕HU

TA贡献1845条经验 获得超8个赞

尝试调用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");

    }

}


@Override

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

}


查看完整回答
反对 回复 2019-10-15
?
皈依舞

TA贡献1851条经验 获得超3个赞

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


查看完整回答
反对 回复 2019-10-15
  • 3 回答
  • 0 关注
  • 830 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信