最近項目中使用相機功能犀盟,需要自定義而晒,整理下,給需要的朋友
實現(xiàn)的功能:前后鏡頭切換且蓬、閃光燈模式(三種)欣硼、對焦题翰、鏡頭手勢縮放恶阴、本地保存、彈窗預(yù)覽
實現(xiàn)邏輯:自定義View繼承自SurfaceView豹障,Activity 布局中引入冯事,在Activity中進行各種操作 拍照,對焦等等
鏡頭切換方法:
//切換攝像頭
private int cameraPosition = 1; //當前選用的攝像頭血公,1后置 0前置
public void switchFrontCamera() {
int cameraCount = Camera.getNumberOfCameras();//得到攝像頭的個數(shù)
Camera.CameraInfo cameraInfo = new Camera.CameraInfo();
for (int i = 0; i < cameraCount; i++) {
Camera.getCameraInfo(i, cameraInfo);//得到每一個攝像頭的信息
if (cameraPosition == 1) {
//現(xiàn)在是后置昵仅,變更為前置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) {//代表攝像頭的方位谈息,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
//重新打開
reStartCamera(i);
cameraPosition = 0;
break;
}
} else {
//現(xiàn)在是前置弄捕, 變更為后置
if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {//代表攝像頭的方位,CAMERA_FACING_FRONT前置 CAMERA_FACING_BACK后置
reStartCamera(i);
cameraPosition = 1;
break;
}
}
}
}
//重新打開預(yù)覽
public void reStartCamera(int i) {
if (camera != null) {
camera.stopPreview();//停掉原來攝像頭的預(yù)覽
camera.release();//釋放資源
camera = null;//取消原來攝像頭
}
try {
camera = Camera.open(i);//打開當前選中的攝像頭
camera.setPreviewDisplay(holder);//通過surfaceview顯示取景畫面
// camera.setDisplayOrientation(90);// 屏幕方向
camera.startPreview();//開始預(yù)覽
} catch (IOException e) {
e.printStackTrace();
}
}
閃光燈模式
camePreview.setIsOpenFlashMode(Camera.Parameters.FLASH_MODE_AUTO);//自動模式
camePreview.setIsOpenFlashMode(Camera.Parameters.FLASH_MODE_ON);//總是開啟
camePreview.setIsOpenFlashMode(Camera.Parameters.FLASH_MODE_OFF);//總是關(guān)閉
//設(shè)置開啟閃光燈(重新預(yù)覽)
public void setIsOpenFlashMode(String mIsOpenFlashMode) {
Camera.Parameters mParameters = camera.getParameters();
//設(shè)置閃光燈模式
mParameters.setFlashMode(mIsOpenFlashMode);
camera.setParameters(mParameters);
}
鏡頭對焦
// 手動對焦
public void autoFocus() {
camera.autoFocus(null);//自動對焦 不需要回調(diào)
}
//自動連續(xù)對焦
Camera.Parameters parameters = camera.getParameters();
if (parameters.getSupportedFocusModes().contains(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)) {
parameters.setFocusMode(android.hardware.Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);// 連續(xù)對焦模式
}
camera.setParameters(parameters);
手勢縮放
//Activity中初始化
ScaleGestureDetector gestureDetector = new ScaleGestureDetector(this, new ScaleGestureListener());
//重寫onTouchEvent方法 獲取手勢
@Override
public boolean onTouchEvent(MotionEvent event) {
//識別手勢
gestureDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
//操作類
class ScaleGestureListener implements ScaleGestureDetector.OnScaleGestureListener {
float mScaleFactor;
@Override
public boolean onScale(ScaleGestureDetector detector) {
if (detector.getCurrentSpan() > mScaleFactor) {
camePreview.zoomOut();
} else {
camePreview.zoomIn();
}
mScaleFactor = detector.getCurrentSpan();
return false;
}
@Override
public boolean onScaleBegin(ScaleGestureDetector detector) {
mScaleFactor = detector.getCurrentSpan();
//一定要返回true才會進入onScale()這個函數(shù)
return true;
}
@Override
public void onScaleEnd(ScaleGestureDetector detector) {
mScaleFactor = detector.getCurrentSpan();
}
}
//自定義相機View中定義方法
//放大
public void zoomOut() {
Camera.Parameters parameters = camera.getParameters();
if (!parameters.isZoomSupported()) return;
int zoom = parameters.getZoom() + 1;
if (zoom < parameters.getMaxZoom()) {
parameters.setZoom(zoom);
camera.setParameters(parameters);
}
}
//縮小
public void zoomIn() {
Camera.Parameters parameters = camera.getParameters();
if (!parameters.isZoomSupported()) return;
int zoom = parameters.getZoom() - 1;
if (zoom >= 0) {
parameters.setZoom(zoom);
camera.setParameters(parameters);
}
}
預(yù)覽使用Dialog蛤高,還有前后攝像頭拍照方向問題
//bitmap旋轉(zhuǎn)90度
Matrix matrix = new Matrix();
matrix.setRotate(90);
Bitmap waterMarkBitmap = Bitmap.createBitmap(waterMarkBitmap, 0, 0, waterMarkBitmap.getWidth(), waterMarkBitmap.getHeight(), matrix, true);