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

版权声明:本文由 追逐繁星 创作,采用 知识共享署名 3.0 中国大陆许可协议 进行许可。 可自由转载、引用,但需署名作者且注明文章出处。 https://blog.csdn.net/u014129816/article/details/39999207

实现此功能分成三个类:

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;//声明起点坐标x
	private float start_y;//声明起点坐标y
	private float end_x;//声明终点坐标x
	private float end_y;//声明终点坐标y
	private 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);//设置画笔为圆形样式
	}

	@Override
	protected void onDraw(Canvas canvas)
	{
		// TODO 自动生成的方法存根
		super.onDraw(canvas);
		canvas.drawBitmap(bitmap, 0, 0, paint);
	}
	
	@Override
	public 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;
	}
	
	@Override
	public 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时调用
	 */
	@Override
	public void surfaceCreated(SurfaceHolder holder)
	{
		// TODO 自动生成的方法存根
		
		try
		{
			//设置Camera的预览显示
			mCamera.setPreviewDisplay(holder);
			//摄像头开始预览
			mCamera.startPreview();
		}
		catch(Exception e)
		{
		}
	}

	/*
	 * 本方法功能:
	 * 改变SurfaceHolder时调用
	 */
	@Override
	public void surfaceChanged(SurfaceHolder holder, int format, int width,
			int height)
	{
		// TODO 自动生成的方法存根
	}

	/*
	 * 本方法功能:
	 * 销毁SurfaceHolder时调用
	 */
	@Override
	public 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;
	
	@Override
	protected 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绑定至frameLayout
		frameLayout = (FrameLayout) findViewById(R.id.camera_preview);
		
		//设置摄像头预览
		mPreview = new CameraPreview(MainActivity.this, mCamera);		
		//设置button 的点击监听事件
		btn_1.setOnClickListener(this);
		
		
	}
	
	//TextView:检查系统是否存在摄像头。如果存在,则返回true;否则,返回false
	private 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方法
	@Override
	public void onClick(View v)
	{
		// TODO 自动生成的方法存根		
		
		switch(btn_flag)
		{
			//当btn_flag = 0 时,摄像头为打开状态,此时,button上应显示CAMERA STOP
			case 0:
			{
				//设置button显示的文本内容为CAMERA STOP
				btn_1.setText("CAMERA STOP".toCharArray(), 0, "CAMERA STOP".length());
				//在FrameLayout中添加摄像头预览CameraPreview
				frameLayout.addView(mPreview);
				//在FrameLayout中添加绘画层Draw				
				frameLayout.addView(draw);

				//将 button 标志位 btn_flag 设为 1
				btn_flag = 1;
				
				break;						
			}
			
			//当btn_flag = 1 时,摄像头为关闭状态,此时,button上应显示CAMERA START
			case 1:
			{
				//设置button显示的文本内容为CAMERA START
				btn_1.setText("CAMERA START".toCharArray(), 0, "CAMERA START".length());
				
				//移除摄像头预览CameraPreview
				frameLayout.removeViews(0, 2);
				
				// 再次创建Camera实例
				mCamera = getCameraInstance();		
				//将FrameLayout绑定至frameLayout
				frameLayout = (FrameLayout) findViewById(R.id.camera_preview);				
				//设置摄像头预览
				mPreview = new CameraPreview(MainActivity.this, mCamera);
				//设置绘画类
				draw = new Draw(MainActivity.this);
				//将button标志位btn_flag置为0
				btn_flag = 0;
				break;
			}
		}
	}
	
	//Activity:Stop状态
	@Override
	protected void onStop()
	{
		// TODO 自动生成的方法存根
		super.onStop();
		finish();
		//Activity的状态是stop时,则销毁mPreview资源
		mPreview.surfaceDestroyed(mPreview.getHolder());
	}
	
	@Override
	protected void onPause()
	{
		// TODO 自动生成的方法存根
		super.onPause();
		finish();
		//Activity的状态是stop时,则销毁mPreview资源
		mPreview.surfaceDestroyed(mPreview.getHolder());
	}

}


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


展开阅读全文

没有更多推荐了,返回首页