如何在Android上的Camera使用的SurfaceView上绘制叠加层? [英] How to draw an overlay on a SurfaceView used by Camera on Android?
问题描述
我有一个简单的程序,将 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>
而是执行以下操作:
- 将
在
中的
FrameLayout
或内部的SurfaceView
布局XML文件,因为
那些允许在
上堆叠窗口小部件Z轴 - 将绘图逻辑
移动到单独的自定义View
class - 将自定义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:
- 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上的Camera使用的SurfaceView上绘制叠加层?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!