如何在Android上的Camera使用的SurfaceView上绘制叠加层? [英] How to draw an overlay on a SurfaceView used by Camera on Android?

查看:1959
本文介绍了如何在Android上的Camera使用的SurfaceView上绘制叠加层?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个简单的程序,将 Camera 的预览绘制到 SurfaceView 中。我想要做的是使用 onPreviewFrame 方法,每当一个新的框架被绘制到 SurfaceView ,以便执行应该调用 onDraw 方法的 invalidate 方法。事实上, onDraw 方法被调用,但没有打印(我猜相机预览正在覆盖我想要绘制的文本)。



这是 SurfaceView 子类的简化版本:

  public class Superficie extends SurfaceView implements SurfaceHolder.Callback {
SurfaceHolder mHolder;
public相机;
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();
parameter.setPreviewSize(w,h);
camera.setParameters(parameters);
camera.startPreview();
}
@Override
public void draw(Canvas canvas){
super.draw(canvas);
//没有绘制:(
Paint p = new Paint(Color.RED);
canvas.drawText(PREVIEW,canvas.getWidth()/ 2,
canvas.getHeight()/ 2,p);
}
}


解决方案

在这方面,SurfaceView 可能不像常规 View / p>

而是执行以下操作:



  1. 中的
    FrameLayout 内部的SurfaceView 布局XML文件,因为
    那些允许在
    上堆叠窗口小部件Z轴

  2. 将绘图逻辑
    移动到单独的自定义 View class

  3. 将自定义View
    类的实例添加到布局XML文件中作为
    FrameLayout
    RelativeLayout ,但是它出现
    SurfaceView

这将导致您的自定义 View 类显示为悬浮在 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上的Camera使用的SurfaceView上绘制叠加层?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

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