如何利用Android上使用摄像头一个SurfaceView覆盖? [英] How to draw an overlay on a SurfaceView used by Camera on Android?
问题描述
我有一个绘制摄像机
的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
可能不会像一个普通的查看
在这方面
相反,请执行以下操作:
- 把你的
SurfaceView
的内的FrameLayout
或RelativeLayout的
的 您的布局XML文件,因为两者的 这让小部件上堆积 Z轴 - 将您的绘图逻辑
到一个单独的自定义
查看
类 - 添加自定义视图的一个实例
类到布局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:
- Put your
SurfaceView
inside of aFrameLayout
orRelativeLayout
in your layout XML file, since both of those allow stacking of widgets on the Z-axis - Move your drawing logic
into a separate custom
View
class - Add an instance of the custom View
class to the layout XML file as a
child of the
FrameLayout
orRelativeLayout
, but have it appear after theSurfaceView
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屋!