使用双surface,将第一个设置为透明背景,在摄像机上绘制图像,纠结搞了一天。
其中参考了http://blog.csdn.net/yanzi1225627/article/details/7934710 的思路和代码,但是,始终会出现 canvas=holder.lockcanvas();返回的canvas为null的情况。加入线程后解决问题。
主Activity:
public class MainActivity extends Activity { private SVDraw surfaceDraw = null; private SurfaceView surfaceView = null; private SurfaceHolder holder1 = null; private Canvas canvas = null; private Camera cam = null; private boolean previewRunning = true; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); //绘制surface1 &nbsp; surfaceView = (SurfaceView) findViewById(R.id.surface1); holder1 = surfaceView.getHolder(); holder1.addCallback(new MySurfaceViewCallback()); holder1.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS); holder1.setFixedSize(500, 350); holder1.setFormat(PixelFormat.TRANSPARENT); canvas = holder1.lockCanvas(); if (canvas != null) { canvas.drawColor(Color.TRANSPARENT); Paint p = new Paint(); p.setAntiAlias(true); p.setColor(Color.RED); p.setStyle(Style.STROKE); // canvas.drawPoint(100.0f, 100.0f, p); canvas.drawLine(0, 110, 500, 110, p); } // 绘制surface2 其中使用线程 surfaceDraw = (SVDraw) findViewById(R.id.mDraw); surfaceDraw.setVisibility(View.VISIBLE); surfaceDraw.drawLine(); } // =============================create surface 1================================================= private class MySurfaceViewCallback implements SurfaceHolder.Callback { @Override public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { } @SuppressWarnings("deprecation") @Override public void surfaceCreated(SurfaceHolder holder) { cam = Camera.open(); // 取得第一个摄像头 Parameters param = cam.getParameters(); // param.setPreviewSize(display.getWidth(), display.getHeight()) ; param.setPreviewFrameRate(5); // 一秒5帧 param.setPictureFormat(PixelFormat.JPEG); // 图片形式 param.set("jpen-quality", 80); cam.setParameters(param); cam.setDisplayOrientation(90); // 纠正摄像头自动旋转,纠正角度,如果引用,则摄像角度偏差90度 try { cam.setPreviewDisplay(holder); } catch (IOException e) { } cam.startPreview(); // 进行预览 previewRunning = true; // 已经开始预览 } @Override public void surfaceDestroyed(SurfaceHolder holder) { if (cam != null) { if (previewRunning) { cam.stopPreview(); // 停止预览 previewRunning = false; } cam.release(); } } } } /*只不过一个是继承的view一个是surfaceview,将AttributeSetattrs加上。只要处理好谁是顶层的view谁设成透明,预览视频的surfaceview设成底层,在且要在xml属性文件里设成visible就可以了*/ public class SVDraw extends SurfaceView implements SurfaceHolder.Callback{ protected SurfaceHolder sh; private int mWidth; private int mHeight; private MyThread thread; public SVDraw(Context context, AttributeSet attrs) { super(context, attrs); sh = this.getHolder(); sh.addCallback(this); sh.setFormat(PixelFormat.TRANSPARENT); setZOrderOnTop(true); } public void surfaceChanged(SurfaceHolder arg0, int arg1, int w, int h) { mWidth = w; mHeight = h; } public void surfaceCreated(SurfaceHolder arg0) { } public void surfaceDestroyed(SurfaceHolder arg0) { } void clearDraw() { Canvas canvas = sh.lockCanvas(); canvas.drawColor(Color.BLUE); sh.unlockCanvasAndPost(canvas); } public void drawLine() { //预览视频的时候绘制图像 /*Canvas canvas = sh.lockCanvas(); canvas.drawColor(Color.TRANSPARENT); Paint p = new Paint(); p.setAntiAlias(true); p.setColor(Color.RED); p.setStyle(Style.STROKE); //canvas.drawPoint(100.0f, 100.0f, p); canvas.drawLine(0,110, 500, 110, p); canvas.drawCircle(110, 110, 10.0f, p); sh.unlockCanvasAndPost(canvas);*/ thread = new MyThread(sh); thread.setRun(true); thread.start(); } } // 绘制线程 public class MyThread extends Thread { private SurfaceHolder holder; private boolean run; public MyThread(SurfaceHolder holder) { this.holder = holder; run = true; } @Override public void run() { int counter = 0; Canvas canvas = null; while (run) { // 具体绘制工作 try { // 获取Canvas对象,并锁定之 canvas = holder.lockCanvas(); // 设定Canvas对象的背景颜色 canvas.drawColor(Color.TRANSPARENT); // 创建画笔 Paint p = new Paint(); // 设置画笔颜色 p.setColor(Color.RED); // 设置文字大小 p.setTextSize(30); // 创建一个Rect对象rect Rect rect = new Rect(100, 50, 380, 330); // 在canvas上绘制rect canvas.drawRect(rect, p); // 在canvas上显示时间 canvas.drawText("Interval = " + (counter++) + " seconds.", 100, 410, p); Thread.sleep(1000); } catch (Exception e) { e.printStackTrace(); } finally { if (canvas != null) { // 解除锁定,并提交修改内容 holder.unlockCanvasAndPost(canvas); } } } } public boolean isRun() { return run; } public void setRun(boolean run) { this.run = run; } } <?xml version="1.0" encoding="utf-8"?> <manifest xmlns:android="http://schemas.android.com/apk/res/android" package="com.example.test02" android:versionCode="1" android:versionName="1.0" > <uses-sdk android:minSdkVersion="8" android:targetSdkVersion="18" /> <application android:allowBackup="true" android:icon="@drawable/ic_launcher" android:label="@string/app_name" android:theme="@style/AppTheme" > <activity android:name="com.example.test02.MainActivity" android:label="@string/app_name" > <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> </application> <!--z> &nbsp;<uses-feature android:name="android.hardware.camera" /> <uses-feature android:name="android.hardware.camera.autofocus" /> <uses-permission android:name="android.permission.CAMERA" /> <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" /> <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" /> </manifest>