Android Camera极简方案支持任意分辨率翻转拉伸不变形

作了挺久Camera相关的事情,有一些使用心得,以及避免踩坑的套路。有兴趣能够看下代码是怎么拼凑出目标功能的,逻辑脏可是功能稳健。不用了解原理,能提供想要的功能用就是了,别学了....android

WechatIMG4.jpg

传送门git

添加依赖

allprojects {
    repositories {
        maven { url 'https://jitpack.io' }
    }
}
implementation 'com.github.readsense-cn:RSUtil:1.3.0'
复制代码

权限

<uses-permission android:name="android.permission.CAMERA" />
复制代码

Android 6.0以上须要动态申请权限github

使用一键应用

在指定页面位置添加控件canvas

<cn.readsense.rscamera.camera.CameraView android:id="@+id/cameraview" android:layout_width="wrap_content" android:layout_height="wrap_content" />
复制代码
class MainActivity : BaseCoreActivity() {
    override fun getLayoutId(): Int {
        requestPermissions(Manifest.permission.CAMERA)//声明权限
        return R.layout.activity_main;//声明布局文件
    }

    override fun initView() {
        cameraview.showToast("长按可弹出配置页");
        addLifecycleObserver(cameraview)//注册camera生命周期
    }
}
复制代码

支持功能

1. 切换摄像头

//改变camera id后释放从新show
cameraView.getCameraParams().facing = Camera.CameraInfo.CAMERA_FACING_BACK;
复制代码

2. 任意角度旋转摄像头预览方向

//show以前,设定display角度,支持(0, 90, 180, 270)
//输入非90倍数将根据activity方向以及设备自动适应,可能不太灵
cameraView.getCameraParams().oritationDisplay = 0;
复制代码

3. 修改预览分辨率

//根据摄像头支持的分辨率,release后从新show
cameraView.getCameraParams().previewSize.previewWidth = 640;
cameraView.getCameraParams().previewSize.previewHeight = 480;
复制代码

4. 摄像头预览左右镜像

cameraView.getCameraParams().filp = true;
复制代码

5. 预览不拉伸任意比例展现

设定cameraview指定宽高后,预览图像,若图像拉伸启用参数bash

//是否横向拉伸参数,非横即竖
cameraView.getCameraParams().scaleWidth = true;
复制代码

6. 回调数据

注册回调后再启动摄像头maven

cameraView.addPreviewFrameCallback(new CameraView.PreviewFrameCallback() {
    @Override
    public Object analyseData(byte[] bytes) {
        //接收yuv数据流,处理后的结果return,该方法执行在子线程
        return null;
    }

    @Override
    public void analyseDataEnd(Object o) {
        //接收analyseData方法返回结果,该方法执行在主线程
    }
});
复制代码

7. 提供预览界面上绘制必要信息的DrawView

//showCameraView以前配置DrawView
cameraView.setDrawView();
//获取drawView,类型为SurfaceView,能够直接在这个Surface绘制必要的信息
SurfaceView drawView = cameraView.getDrawView();
Canvas canvas = drawView.getHolder().lockCanvas();
if (canvas != null) {
    canvas.drawColor(0, PorterDuff.Mode.CLEAR);

    //...插入绘制代码

    drawView.getHolder().unlockCanvasAndPost(canvas);
}
复制代码

8. 长按camearview,弹出配置栏进行动态配置, 确认生效

WechatIMG4.jpg

END

传送门ide

相关文章
相关标签/搜索