Android自定义相机

作者: 简祖明 | 来源:发表于2018-05-15 14:53 被阅读123次

    CustomCamera

    android自定义相机

    功能描述:

    1. 主要可自定义相机的各类按钮布局
    2. 相机拍照缩放功能
    3. 相机的宽高设置
    4. 前后摄像头拍照设置

    使用方法

    一、添加依赖

    Step 1. Add it in your root build.gradle at the end of repositories:

    allprojects {
        repositories {
            ...
            maven { url 'https://jitpack.io' }
        }
    }
    

    Step 2. Add the dependency

    dependencies {
            implementation 'com.github.jianjin33:CustomCamera:v1.0.3'
    }
    

    二、清单文件中配置权限

    <uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.MOUNT_UNMOUNT_FILESYSTEMS" />
    <uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
    <uses-permission android:name="android.permission.CAMERA" />
    
    <uses-feature android:name="android.hardware.camera.autofocus" />
    <uses-feature android:name="android.hardware.camera" />
    

    三、初始化

    可以在自定义Application或开启相机界面之前的适当位置,添加一下初始化代码:

    CustomCameraAgent.init(this);
    

    还可以配置一些属性:

    CustomCameraAgent.openLog(); 打开日志
    CustomCameraAgent.setCameraWidthAndHeight(); 设置相机预览界面的宽高和照片的宽高
    CustomCameraAgent.setPicFileName(); 设置自定义相机照片存储路径,默认在photos文件夹下

    四、Activity

    1. 布局文件中使用CameraContainer控件;
    2. onCreate方法中初始化CameraManager,并绑定开关灯View和切换前后摄像头view,第三第四个参数为灯状态和前后摄像头时的文字提示,可为null。
    mCameraManager = CameraManager.getInstance(this);
    mCameraManager.bindOptionMenuView(mCameraIvLight, mCameraTvSwitch, flashHint, null);
    mCameraContainer.bindActivity(this);
    
    1. 当相机不可见时,及时释放相机的资源及注销一些传感器的监听,调用CameraContainer.onStop(),恢复界面时调用CameraContainer.onStart();
    @Override
    protected void onResume() {
        super.onResume();
        if (mCameraContainer != null) {
            mCameraContainer.onStart();
        }
    }
    
    @Override
    protected void onPause() {
        super.onPause();
        if (mCameraContainer != null) {
            mCameraContainer.onStop();
        }
    }
    
    1. 界面销毁时释放相机资源
    @Override
    protected void onDestroy() {
       super.onDestroy();
       mCameraManager.unbindView();
       if (mCameraContainer != null) {
           mCameraContainer.releaseCamera();
       }
    }
    
    1. 拍照、切换摄像头和开关闪光灯等功能:

    mCameraContainer.switchFlashMode(); 开启关闭闪光灯。这里注意只有当光线较暗的情况下才会显示开灯按钮;
    mCameraContainer.switchCamera(); 切换前后相机
    mCameraContainer.takePicture(ISavePicCallback); 拍照,传入存储图片完成后的回调接口ISavePicCallback

    效果图

    效果图

    CustomCamera库

    image.png

    不算复杂的类库,结构如上图,大致介绍一下各自功能,比较重要的类有:

    • CameraCotainer:是个ViewGroup,包含相机预览界面、相机焦点显示隐藏及焦点位置控制,缩放相机预览界面进行缩放的操作和控制;
    • CameraPreview:继承SurfaceView,结合CameraManager控制相机的初始化,开关灯,切换摄像头等功能;
    • FocusImageView :相机焦点控件;
    • PreviewLightCallback:监听光线是否昏暗,控制是否显示开灯按钮;
    • CustomCameraAgent:初始化库使用;
    • SavePicHandler、UIHandler:存储照片在子线程中进行;
    • SensorController:加速传感器,根据速度大小控制是否开始锁定焦点进行相机变焦。
    1. 入口为CustomCameraAgent,进行初始化,配置Application和一些参数。
    2. 相机界面会用到CameraContainer控件,是一个FrameLayout,主要是添加了一个CameraPreview控件,两者都实现了ICameraOperation接口,(是一个操作相机的接口,可以看成CameraContainer是CameraPreview一种代理模式,最终的实现都在CameraPreview中完成,高层只会调用CameraContainer的方法)

    Github CustomCamera

    相关文章

      网友评论

      • N城渔夫:我支持你、新增自定义布局
      • 7d03d33a7306:这个可以,把拍照的区域设置成自定义的吗?比如设置成圆形的,然后出来的照片也是圆形的
        7d03d33a7306:@简祖明 嗯嗯
        简祖明:@不易啊 现在还不行,有时间我把设置拍照尺寸的地方扩展一下,改成可以设置各种形状

      本文标题:Android自定义相机

      本文链接:https://www.haomeiwen.com/subject/zzgedftx.html