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

时间:2022-09-18 06:04:01

实现此功能分成三个类:

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