Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/redis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何在Android上的摄像头使用的SurfaceView上绘制覆盖图?_Android_Camera_Surfaceview - Fatal编程技术网

如何在Android上的摄像头使用的SurfaceView上绘制覆盖图?

如何在Android上的摄像头使用的SurfaceView上绘制覆盖图?,android,camera,surfaceview,Android,Camera,Surfaceview,我有一个简单的程序,可以将相机的预览绘制到表面视图中。我想做的是使用onPreviewFrame方法,每次在SurfaceView中绘制新帧时都会调用该方法,以便执行invalidate方法,该方法应该调用onDraw方法。实际上,调用了onDraw方法,但是没有打印任何内容(我想相机预览会覆盖我试图绘制的文本) 这是我拥有的SurfaceView子类的简化版本: public class Superficie extends SurfaceView implements SurfaceHold

我有一个简单的程序,可以将
相机的预览绘制到
表面视图中。我想做的是使用
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);
 }
}

SurfaceView
在这方面可能不像常规的
视图那样工作

相反,请执行以下操作:

  • 将您的
    SurfaceView
    放入
    FrameLayout
    或中的
    RelativeLayout
    您的布局XML文件,因为 它们允许在屏幕上堆叠小部件 Z轴
  • 移动图形逻辑 进入单独的自定义
    视图
  • 添加自定义视图的实例 类将布局XML文件作为
    框架布局的子级
    RelativeLayout
    ,但将其显示 在
    SurfaceView之后

  • 这将导致您的自定义
    视图
    类浮动在
    SurfaceView
    上方

    我认为您应该先调用
    super.draw()
    方法,然后再在SurfaceView的draw方法中执行任何操作

    尝试调用
    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");
    }
    
    并从
    ontochevent
    调用
    invalidate

    public boolean onTouch(View v, MotionEvent event) {
    
        invalidate();
        return true;
    }
    

    非常感谢。。。这是一个很好的例子,我相信这就是我所需要做的:)@commonware那么,在您试图将一个surfaceview覆盖在另一个surfaceview之上的情况下,您提供的工作是否可以回答这个问题?自定义视图类是什么意思?我问这个问题的原因是因为我在这里遇到了一个类似的问题:@rohanbk:据我所知,你不能覆盖两个
    SurfaceView
    widget。“您所说的自定义视图类是什么意思?”——您自己的
    android.View.View
    子类,或者您自己的现有widget类的子类。@Commonware那么,在您诚实的意见中,我是否有办法修改API演示中的SurfaceViewOverlay示例()这样我就可以使用FrameLayout在摄像头surfaceview上的surfaceview中绘制位图图像了?@rohanbk:绘制位图图像不需要
    surfaceview
    。例如,
    ImageView
    不使用
    SurfaceView
    ,AFAIK。你能告诉我你是怎么做的吗?我正在尝试更改按钮单击时的绘图颜色,如按钮1->红色按钮2->黄色等。我将如何使用画布?我想在live camera上应用与live camera effects相同的效果,这正是他在其原始代码中所做的:)