3.在Android上显示摄像头,并在摄像头画面上画图

来源:互联网 发布:中国移动电视网络页面 编辑:程序博客网 时间:2024/05/20 02:27

实现此功能分成三个类:

1.Draw 类:画图类,负责配置画图的Canvas,Paint,Bitmap

2.CameraPreview类:显示摄像头预览类,负责配置摄像头的Camera,SurfaceView

3.MainActivity类:主界面类,负责主界面的添加视图和删除视图,以及释放资源等操作


Draw类:


package com.example.open_camera;import android.content.Context;import android.graphics.Bitmap;import android.graphics.Canvas;import android.graphics.Color;import android.graphics.Paint;import android.view.MotionEvent;import android.view.View;public class Draw extends View implements View.OnClickListener{private float start_x;//声明起点坐标xprivate float start_y;//声明起点坐标yprivate float end_x;//声明终点坐标xprivate float end_y;//声明终点坐标yprivate Canvas canvas;//声明画笔private Paint paint;//声明画布private Bitmap bitmap;//声明位图public Draw(Context context){super(context);// TODO 自动生成的构造函数存根//创建一个画笔paint = new Paint(Paint.DITHER_FLAG);//设置位图的宽高,采用32位ARGB位图模式bitmap = Bitmap.createBitmap(320, 480, Bitmap.Config.ARGB_8888);canvas = new Canvas(bitmap);paint.setStyle(Paint.Style.STROKE);//设置非填充paint.setStrokeWidth(5);//笔宽5像素paint.setColor(Color.RED);//设置为红笔paint.setAntiAlias(true);//锯齿不显示paint.setDither(true);//设置图像抖动处理paint.setStrokeJoin(Paint.Join.ROUND);//设置图像的结合方式paint.setStrokeCap(Paint.Cap.ROUND);//设置画笔为圆形样式}@Overrideprotected void onDraw(Canvas canvas){// TODO 自动生成的方法存根super.onDraw(canvas);canvas.drawBitmap(bitmap, 0, 0, paint);}@Overridepublic boolean onTouchEvent(MotionEvent event){// TODO 自动生成的方法存根//检测手指落下的动作if(event.getAction() == MotionEvent.ACTION_DOWN){start_x = event.getX();//获取手指落下的x坐标start_y = event.getY();//获取手指落下的y坐标canvas.drawPoint(start_x, start_y, paint);//在画布上画点}//检测手指移动的动作if(event.getAction() == MotionEvent.ACTION_MOVE){end_x = event.getX();//获取手指移动的x坐标end_y = event.getY();//获取手指移动的y坐标canvas.drawLine(start_x, start_y, end_x, end_y, paint);//在画布上画线start_x = end_x;//将上一个终止点的x坐标赋值给起始点的x坐标start_y = end_y;//将上一个终止点的y坐标赋值给起始点的y坐标}invalidate();//使绘画动作生效return true;}@Overridepublic void onClick(View v){// TODO 自动生成的方法存根}}


CameraPreview类:


package com.example.open_camera;import android.content.Context;import android.hardware.Camera;import android.view.SurfaceHolder;import android.view.SurfaceView;/* * 本类主要功能: * 继承SurfaceView类,并实现SurfaceHolder.Callback接口 *  */public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback{public SurfaceHolder mHolder;public Camera mCamera;/* * 本方法是构造方法 * 获取系统摄像头对象,及系统上下文 *  */public CameraPreview(Context context, Camera camera){// TODO 自动生成的构造函数存根super(context);mCamera = camera;//安装一个SurfaceHolder.Callback,        // 这样创建和销毁底层surface时能够获得通知。mHolder = this.getHolder();mHolder.addCallback(this);//摄像头界面旋转180度mCamera.setDisplayOrientation(180);}/** * @param args */public static void main(String[] args){// TODO 自动生成的方法存根}/* * 本方法功能: * 创建SurfaceHolder时调用 */@Overridepublic void surfaceCreated(SurfaceHolder holder){// TODO 自动生成的方法存根try{//设置Camera的预览显示mCamera.setPreviewDisplay(holder);//摄像头开始预览mCamera.startPreview();}catch(Exception e){}}/* * 本方法功能: * 改变SurfaceHolder时调用 */@Overridepublic void surfaceChanged(SurfaceHolder holder, int format, int width,int height){// TODO 自动生成的方法存根}/* * 本方法功能: * 销毁SurfaceHolder时调用 */@Overridepublic void surfaceDestroyed(SurfaceHolder holder){// TODO 自动生成的方法存根if(mCamera != null){//释放摄像头资源mCamera.release();mCamera = null;}}}


MainActivity类:


package com.example.open_camera;import android.app.Activity;import android.content.Context;import android.content.pm.PackageManager;import android.hardware.Camera;import android.os.Bundle;import android.util.Log;import android.view.View;import android.view.View.OnClickListener;import android.widget.Button;import android.widget.FrameLayout;import android.widget.TextView;/* * 本类是主界面类 */public class MainActivity extends Activity implements OnClickListener{Button btn_1;private Camera mCamera;private CameraPreview mPreview;int btn_flag = 0;FrameLayout frameLayout;Draw draw;@Overrideprotected void onCreate(Bundle savedInstanceState){// TODO 自动生成的方法存根super.onCreate(savedInstanceState);setContentView(R.layout.activity_main);/*TextView设置*/TextView tv = (TextView) findViewById(R.id.text_1);draw = new Draw(MainActivity.this);//检查设备是否有摄像头,并设置相应的文本信息if(checkCameraHardware(getBaseContext())){tv.setText("CAMERA IS READY".toCharArray(), 0, "CAMERA IS READY".length());}else{tv.setText("CAMERA NOT READY".toCharArray(), 0, "CAMERA NOT READY".length());}/*Button设置*/btn_1 = (Button) findViewById(R.id.btn_1);// 创建Camera实例mCamera = getCameraInstance();//将FrameLayout绑定至frameLayoutframeLayout = (FrameLayout) findViewById(R.id.camera_preview);//设置摄像头预览mPreview = new CameraPreview(MainActivity.this, mCamera);//设置button 的点击监听事件btn_1.setOnClickListener(this);}//TextView:检查系统是否存在摄像头。如果存在,则返回true;否则,返回falseprivate boolean checkCameraHardware(Context context){if(context.getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)){return true;}else{return false;}}//FrameLayout:获取摄像头实例public static Camera getCameraInstance(){Camera c = null;try{c = Camera.open();}catch(Exception e){Log.e("Error", "getCameraInstance");}return c;}//Button:重写onClick方法@Overridepublic void onClick(View v){// TODO 自动生成的方法存根switch(btn_flag){//当btn_flag = 0 时,摄像头为打开状态,此时,button上应显示CAMERA STOPcase 0:{//设置button显示的文本内容为CAMERA STOPbtn_1.setText("CAMERA STOP".toCharArray(), 0, "CAMERA STOP".length());//在FrameLayout中添加摄像头预览CameraPreviewframeLayout.addView(mPreview);//在FrameLayout中添加绘画层DrawframeLayout.addView(draw);//将 button 标志位 btn_flag 设为 1btn_flag = 1;break;}//当btn_flag = 1 时,摄像头为关闭状态,此时,button上应显示CAMERA STARTcase 1:{//设置button显示的文本内容为CAMERA STARTbtn_1.setText("CAMERA START".toCharArray(), 0, "CAMERA START".length());//移除摄像头预览CameraPreviewframeLayout.removeViews(0, 2);// 再次创建Camera实例mCamera = getCameraInstance();//将FrameLayout绑定至frameLayoutframeLayout = (FrameLayout) findViewById(R.id.camera_preview);//设置摄像头预览mPreview = new CameraPreview(MainActivity.this, mCamera);//设置绘画类draw = new Draw(MainActivity.this);//将button标志位btn_flag置为0btn_flag = 0;break;}}}//Activity:Stop状态@Overrideprotected void onStop(){// TODO 自动生成的方法存根super.onStop();finish();//Activity的状态是stop时,则销毁mPreview资源mPreview.surfaceDestroyed(mPreview.getHolder());}@Overrideprotected void onPause(){// TODO 自动生成的方法存根super.onPause();finish();//Activity的状态是stop时,则销毁mPreview资源mPreview.surfaceDestroyed(mPreview.getHolder());}}


工程源文件下载地址:http://download.csdn.net/detail/u014129816/8046051


0 0