如何利用Android上使用摄像头一个SurfaceView覆盖? [英] How to draw an overlay on a SurfaceView used by Camera on Android?

查看:892
本文介绍了如何利用Android上使用摄像头一个SurfaceView覆盖?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个绘制摄像机的preVIEW成 SurfaceView 一个简单的程序。使用在previewFrame 的方法,这是每一个新的帧被吸入 SurfaceView <时调用我正在试图做的是/ code>,以执行废止方法,应该调用的OnDraw 方法。事实上,的OnDraw 方法被调用,但是什么也没有正印(我猜的摄像头preVIEW被改写我试图绘制文本)。

这是 SurfaceView 子类我有一个简化版本:

 公共类Superficie扩展了SurfaceView实现SurfaceHolder.Callback {
 SurfaceHolder mHolder;
 公共摄像头摄像头;
 Superficie(上下文的背景下){
  超(上下文);
  mHolder = getHolder();
  mHolder.addCallback(本);
  mHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
 }
 公共无效surfaceCreated(最终SurfaceHolder持有者){
  相机= Camera.open();
  尝试 {
   camera.set previewDisplay(保持器);
   camera.set previewCallback(新previewCallback(){
    在previewFrame(byte []的数据,摄像机ARG1){公共无效
     invalidar();
    }
   });
  }赶上(IOException异常E){}
 }
 公共无效invalidar(){
  无效();
 }
 公共无效surfaceChanged(SurfaceHolder持有人,INT格式,INT W,INT高){
  Camera.Parameters参数= camera.getParameters();
  parameters.set previewSize(W,H);
  camera.setParameters(参数);
  camera.start preVIEW();
 }
 @覆盖
 公共无效画(油画画布){
  super.draw(画布);
  //没有被抽:(
  涂料P =新的油漆(Color.RED);
  canvas.drawText(preVIEW,canvas.getWidth()/ 2,
    canvas.getHeight()/ 2,p)的;
 }
}
 

解决方案

SurfaceView 可能不会像一个普通的查看在这方面

相反,请执行以下操作:

  1. 把你的 SurfaceView 的内 的FrameLayout RelativeLayout的的 您的布局XML文件,因为两者的 这让小部件上堆积 Z轴
  2. 将您的绘图逻辑 到一个单独的自定义查看
  3. 添加自定义视图的一个实例 类到布局XML文件作为一个 儿童的的FrameLayout RelativeLayout的,但它出现 在 SurfaceView

这将导致您的自定义查看类出现漂浮在 SurfaceView

看到这里的示例项目的那层弹出的面板上面有 SurfaceView 用于视频播放。

I have a simple program that draws the preview of the Camera into a SurfaceView. What I'm trying to do is using the onPreviewFrame method, which is invoked each time a new frame is drawn into the SurfaceView, in order to execute the invalidate method which is supposed to invoke the onDraw method. In fact, the onDraw method is being invoked, but nothing there is being printed (I guess the camera preview is overwriting the text I'm trying to draw).

This is a simplify version of the SurfaceView subclass I have:

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 probably does not work like a regular View in this regard.

Instead, do the following:

  1. Put your SurfaceView inside of a FrameLayout or RelativeLayout in your layout XML file, since both of those allow stacking of widgets on the Z-axis
  2. Move your drawing logic into a separate custom View class
  3. Add an instance of the custom View class to the layout XML file as a child of the FrameLayout or RelativeLayout, but have it appear after the SurfaceView

This will cause your custom View class to appear to float above the SurfaceView.

See here for a sample project that layers popup panels above a SurfaceView used for video playback.

这篇关于如何利用Android上使用摄像头一个SurfaceView覆盖?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆