Personalizar la cámara Disparo continuo de la cámara en Android

La última vez presentamos el uso de la cámara para tomar fotografías y lograr el efecto de una cámara personalizada. Esta vez nos basamos en el último proyecto para lograr un efecto de disparo continuo. Se ofreció la última ruta del blog

El uso de la cámara personalizada Camera en Android

Bien, comencemos con el tema.

Basado en el último proyecto, primero agregamos algunas variables globales requeridas.

//连拍属性
private boolean isShooting = false;//是否正在连拍
private int shooting_num = 0;//已经拍摄的相片数量
private ArrayList<String> mShootingArray;//连拍的相片保存路径队列

Luego escribimos un método para realizar disparos continuos

/**
 * 执行连拍动作。外部调用该方法完成连拍
 */
public void doTakeShooting(){
    mShootingArray = new ArrayList<>();
    isShooting = true;
    shooting_num = 0;
}

Luego modifique el método desencadenado por el evento de clic

@Override
public void onClick(View v) {
    switch (v.getId()) {
        case R.id.bt_take_photo:
            //点击拍照
            //doTakePicture();
            //点击连拍
            doTakeShooting();
            break;
    }
}

Luego soltamos una línea de código en el último proyecto. Puede encontrar que existe una oración de este tipo en el método de devolución de llamada surfaceChanged de la devolución de llamada SurfaceHolder.Callback la última vez

//设置相机的预览监听器。注意这里的setPreviewCallback给连拍功能用
//            mCamera.setPreviewCallback(mPr);

Acabamos de abrir este comentario.

Luego agregamos este monitor, el código es el siguiente

    /**
     * 定义一个画面预览的回调监听器,在此可捕获动态的连续图片
     */
    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();
            }
        }
    };

De esta forma, cuando hagamos clic para hacer una foto, haremos directamente nueve fotografías seguidas.

Supongo que te gusta

Origin blog.csdn.net/weixin_38322371/article/details/115161027
Recomendado
Clasificación