Android 使用CameraX拍照,自動對焦,以及證件照剪下
阿新 • • 發佈:2021-02-09
技術標籤:AndroidandroidCameraX拍照對焦剪下
想看更多演算法題,可以掃描上方二維碼關注我微信公眾號“資料結構和演算法”,截止到目前我已經在公眾號中更新了500多道演算法題,其中部分已經整理成了pdf文件,截止到目前總共有800多頁(並且還會不斷的增加),可以在公眾號中回覆關鍵字“pdf”即可下載。
在Android中拍照最初使用的是Camera,現在基本上已經被廢棄了,然後就是Camera2,這個使用更靈活,但有一點複雜,然後就是CameraX了,這個使用起來更方便。我們先來看一下演示效果
他可以使用前置或者後置攝像頭拍照,自動對焦,也可以實現證件照並實現剪下
使用方式
在根目錄的buid.gradle檔案中新增
allprojects {
repositories {
...
maven { url 'https://jitpack.io' }
}
}
然後在使用的module的buid.gradle中新增
implementation 'com.github.sdwwld:CameraX:1.0.2'
使用方式很簡單,幾行程式碼即可
new CameraParam.Builder()
.setActivity(this)
. setTargetActivity(CameraActivity.class)
.build();
當然如果不能滿足你的需求,還可以修改更多的屬性
String cameraPath = Environment.getExternalStorageDirectory().getPath() + File.separator + "DCIM" + File.separator + "Camera";
File cameraFolder = new File(cameraPath) ;
if (!cameraFolder.exists()) {
cameraFolder.mkdirs();
}
SimpleDateFormat simpleDateFormat = new SimpleDateFormat("yyyyMMdd_HHmmss");
CameraParam mCameraParam =
new CameraParam.Builder()
.setActivity(this)//!!!引數必須要有
.setTargetActivity(CameraActivity.class)//!!!引數必須要有
.setFront(false)//是否是前置攝像頭,true是前置攝像頭,false是後置攝像頭
.setShowMask(true)//是否顯示裁剪區,如果顯示,圖片會進行裁剪
.setShowSwitch(true)//是否顯示攝像頭切換按鈕,如果顯示,可以點選切換前後攝像頭
.setSwitchLeft(Tools.dp2px(this, 40))//攝像頭切換按鈕到螢幕左邊的距離
.setSwitchTop(Tools.dp2px(this, 40))//攝像頭切換按鈕到螢幕上邊的距離
.setSwitchSize(Tools.dp2px(this, 40))//攝像頭切換按鈕的大小(寬高一樣,是正方形的)
.setBackText("返回")//下面返回鍵顯示的文字
.setBackColor(Color.WHITE)//下面返回鍵的顏色
.setBackSize(16)//下面返回鍵的尺寸
.setBackLeft(Tools.dp2px(this, 10))//返回鍵到螢幕左邊的距離
.setTakePhotoSize(Tools.dp2px(this, 60))//拍照按鈕的大小(還有拍照完之後顯示的儲存和放棄儲存的按鈕,這3個按鈕的大小是一樣的)
.setMaskMarginLeftAndRight(Tools.dp2px(this, 20))//如果顯示裁剪框,裁剪框左右兩邊倒螢幕的距離
.setMaskMarginTop(Tools.dp2px(this, 120))如果顯示裁剪框,裁剪框到螢幕上邊的距離
.setMaskRatioW(8)//下面一行和當前行表示的是裁剪框的寬高比
.setMaskRatioH(5)
.setResultBottom(Tools.dp2px(this, 60))//拍照按鈕到螢幕下邊的距離(還有拍照完之後顯示的儲存和放棄儲存的按鈕)
.setResultLeftAndRight(Tools.dp2px(this, 60))//拍照完之後顯示的儲存和放棄儲存的按鈕到左邊和右邊的距離
.setSwitchImgId(R.drawable.ic_switch)//切換攝像頭的按鈕
.setMaskImgId(R.drawable.bg_bankcard)//剪下框
.setSaveImgId(R.mipmap.success)//拍照成功之後的儲存按鈕
.setCancelImgId(R.mipmap.failed)//拍照成功之後的放棄按鈕
.setTakePhotoImgId(R.mipmap.take_button)//拍照按鈕
.setPicturePath(cameraFolder.getAbsolutePath() + File.separator + "IMG_" + simpleDateFormat.format(new Date()) + ".jpg")//拍照儲存的路徑
.setShowFocusTips(true)//點選螢幕聚焦成功的時候是否需要提示
.setFocusFailTips("聚焦失敗")//聚焦失敗的提示
.setFocusSuccessTips("聚焦成功")//聚焦成功的提示
.setFocusViewTime(3)//聚焦的時間,是秒
.setFocusViewColor(ContextCompat.getColor(this, R.color.blue))//聚焦框的顏色
.setFocusViewSize(Tools.dp2px(this, 60))//聚焦框的大小(正方形的)
.setCornerViewSize(Tools.dp2px(this, 12))//聚焦框的圓角大小
.setFocusViewStrokeSize(Tools.dp2px(this, 2))//聚焦框線條寬度
.setRequestCode(CameraConstant.REQUEST_CODE)//請求碼
.build();
//前兩個引數是必須要有的,後面的引數不是必須的,如果想獲取預設引數可以像下面這樣
Log.d("wld______", mCameraParam.getPicturePath());
至於檔案的獲取路徑可以使用下面的方式
@Override
protected void onActivityResult(int requestCode, int resultCode, @Nullable Intent data) {
super.onActivityResult(requestCode, resultCode, data);
//requestCode預設是CameraConstant.REQUEST_CODE ,當然也可以在上面的CameraParam建立的時候
//呼叫setRequestCode修改
if (requestCode == CameraConstant.REQUEST_CODE && resultCode == RESULT_OK) {
//獲取圖片路徑
String picturePath = data.getStringExtra(CameraConstant.PICTURE_PATH_KEY);
//顯示出來
img_picture.setVisibility(View.VISIBLE);
img_picture.setImageBitmap(BitmapFactory.decodeFile(picturePath));
}
}
具體專案demo可以到github上下載。