摄像头的预览网上的示例很多,都是用一个SurfaceView来做容器。所以要往预览画面上面写字,最直接的想法,当然是从SurfaceView那里锁定一个Canvas来画东西了。但是马上就会发现这种方法是不行的,因为这个SurfaceView必须设成SURFACE_TYPE_PUSH_BUFFERS这个类型,也就是不自己管理buffer,这样才能让预览画面由摄像头自己管理,所以无法取得Canvas。
第二个思路,就是在用于预览的SurfaceView上面再叠加另外一个SurfaceView,用第二个SurfaceView来显示叠加信息。但是马上就会发现,此路依然不通,因为SurfaceView是没法设成透明的,叠加的信息显示出来了,但是预览画面却又会被遮盖掉。
冥思苦想了几分钟,找到了办法:用一个AbsoluteLayout来装预览SurfaceView,然后编程添加类似TextView等内容动态添加到AbsoluteLayout里面。
试验成功。下一步试验内容是获取罗盘状态和GPS坐标。
关键代码:
@Override
public void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
getWindow().setFormat(PixelFormat.TRANSLUCENT);
requestWindowFeature(Window.FEATURE_NO_TITLE);
getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN);
layout=new AbsoluteLayout(this);
setContentView(layout);
surfaceCamera=new SurfaceView(this);
holderCamera=surfaceCamera.getHolder();
holderCamera.addCallback(new CameraCallback());
holderCamera.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);
holderCamera.setKeepScreenOn(true);
layout.addView(surfaceCamera);
layout.setOnTouchListener(new View.OnTouchListener() {
int i=0;
@Override
public boolean onTouch(View v, MotionEvent event) {
try
{
TextView tv=new TextView(Main.this);
tv.setText("x");
AbsoluteLayout.LayoutParams lp=new AbsoluteLayout.LayoutParams(
ViewGroup.LayoutParams.WRAP_CONTENT,
ViewGroup.LayoutParams.WRAP_CONTENT,
(int)event.getX(),(int)event.getY());
layout.addView(tv,lp);
i+=10;
}catch(Exception e)
{
Toast.makeText(Main.this, e.toString(), Toast.LENGTH_LONG).show();
}
return false;
}
});
}
没有评论:
发表评论