如何在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相同的效果,这正是他在其原始代码中所做的:)