我有一个绘制摄像机
的preVIEW成 SurfaceView
一个简单的程序。使用在previewFrame
的方法,这是每一个新的帧被吸入 SurfaceView ,以执行
废止
方法,应该调用的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
在
![微软 双屏笔电 双屏手机下年开卖 拆解Surface Neo.Surface Duo 卖点](https://p.xsw88.cn/allimgs/daicuo/20230911/4074.png)
这将导致您的自定义查看
类出现漂浮在 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 yourSurfaceView
inside of a
FrameLayout
or RelativeLayout
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
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.
相关推荐
最新文章