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

相關文章
相關標籤/搜索