我们上次介绍了利用Camera进行拍照,实现自定义相机的效果。这一次我们基于上一次的项目,实现连拍效果。上次博客路径奉上
好了,我们正题开始。
基于上一次的项目,首先我们添加一些需要的全局变量。
//连拍属性
private boolean isShooting = false;//是否正在连拍
private int shooting_num = 0;//已经拍摄的相片数量
private ArrayList<String> mShootingArray;//连拍的相片保存路径队列
接着我们编写一个执行连拍的方法
/**
* 执行连拍动作。外部调用该方法完成连拍
*/
public void doTakeShooting(){
mShootingArray = new ArrayList<>();
isShooting = true;
shooting_num = 0;
}
然后修改点击事件触发的方法
@Override
public void onClick(View v) {
switch (v.getId()) {
case R.id.bt_take_photo:
//点击拍照
//doTakePicture();
//点击连拍
doTakeShooting();
break;
}
}
接着我们放开上次项目中的一句代码。大家可能发现,上次SurfaceHolder.Callback回调的surfaceChanged回调方法中,有这样一句话
//设置相机的预览监听器。注意这里的setPreviewCallback给连拍功能用
// mCamera.setPreviewCallback(mPr);
我们把这个注释打开就好。
接着我们就加入这个监听,代码如下
/**
* 定义一个画面预览的回调监听器,在此可捕获动态的连续图片
*/
private Camera.PreviewCallback mPr = new Camera.PreviewCallback() {
@Override
public void onPreviewFrame(byte[] data, Camera camera) {
if (!isShooting){
return;
}
//获取相机的参数信息
Camera.Parameters parameters = camera.getParameters();
//获得预览数据的格式
int imageFormat = parameters.getPreviewFormat();
int width = parameters.getPreviewSize().width;
int height = parameters.getPreviewSize().height;
Rect rect = new Rect(0,0,width,height);
//创建一个YUV格式的图像对象
YuvImage yuvImage = new YuvImage(data,imageFormat,width,height,null);
try {
ByteArrayOutputStream bos = new ByteArrayOutputStream();
yuvImage.compressToJpeg(rect,80,bos);
//从字节数组中解析出位图数据
Bitmap raw = BitmapFactory.decodeByteArray(bos.toByteArray(),0,bos.size());
//旋转位图
Bitmap bitmap = getRotateBitmap(raw,(mCameraType == CAMERA_BEHIND)?90:-90);
//获取本次拍摄的照片路径
List<String> listPath = new ArrayList<>();
listPath.add("myCamera");
listPath.add("photos");
String path = PathGetUtil.getLongwayPath(MainActivity.this, listPath);
File fileDir = new File(path);
if (!fileDir.exists()) {
fileDir.mkdirs();
}
File filePic = new File(path, "ww" + System.currentTimeMillis() + ".jpg");
if (!filePic.exists()) {
try {
filePic.createNewFile();
} catch (IOException e) {
e.printStackTrace();
}
}
saveImage(filePic.getPath(), bitmap);
//在此进入预览画面
camera.startPreview();
shooting_num++;
mShootingArray.add(path);
if (shooting_num>8){
//每次连拍9张
isShooting = false;
ToastUtil.toastWord(MainActivity.this,"已完成连拍");
}
} catch (Exception e) {
e.printStackTrace();
}
}
};
这样当我们点击拍照的时候就会直接连拍九张图片。