android 自定义相机,Camera,相机遮罩层
生活随笔
收集整理的這篇文章主要介紹了
android 自定义相机,Camera,相机遮罩层
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
實(shí)現(xiàn)效果:
? ??
?
實(shí)現(xiàn)方法:一個(gè)自定義view實(shí)現(xiàn)demo
?
一、自定義相機(jī)Camera,無(wú)API版本限制
?
(1)。實(shí)現(xiàn)接口 implements SurfaceHolder.Callback
private SurfaceView mView;private Camera mCamera; private int cameraId = 0;//前置1、后置0初期化Camera
@Overridepublic void surfaceCreated(SurfaceHolder holder) {Camera.CameraInfo cameraInfo = new Camera.CameraInfo();for (int i = 0; i < Camera.getNumberOfCameras(); i++) {Camera.getCameraInfo(i, cameraInfo);if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_BACK) {if (cameraId == 0) cameraId = i;}}mCamera = Camera.open(cameraId);mCamera.setDisplayOrientation(90);Camera.getCameraInfo(cameraId, cameraInfo);if (cameraInfo.facing == Camera.CameraInfo.CAMERA_FACING_FRONT) { // mFaceView.setFront(true);}Log.i(TAG, "surfaceCreated");try {mCamera.setPreviewDisplay(mView.getHolder());} catch (Exception e) {Log.e(TAG, "Could not preview the image.", e);}}(2)、布局layout.xml添加SurfaceView預(yù)覽相機(jī)
<SurfaceViewandroid:id="@+id/surfaceview"android:layout_width="match_parent"android:layout_height="match_parent"android:layout_centerInParent="true"/> mView = (SurfaceView) findViewById(R.id.surfaceview); mCamera.setPreviewDisplay(mView.getHolder());(3)、啟動(dòng)相機(jī)Camera類
private void startPreview() {if (mCamera != null) {Log.i(TAG, "startPreview0000");mCamera.startPreview();mCamera.setPreviewCallback(this);} } @Override protected void onPostCreate(Bundle savedInstanceState) {super.onPostCreate(savedInstanceState);// Check for the camera permission before accessing the camera. If the// permission is not granted yet, request permission.SurfaceHolder holder = mView.getHolder();holder.addCallback(this);holder.setFormat(ImageFormat.NV21);Log.i("lgq", "......onPostCreate"); }?
(4)、點(diǎn)擊拍照獲取照片
創(chuàng)建回Camera調(diào)接口
private Camera.PictureCallback mPicture = new Camera.PictureCallback() {@Overridepublic void onPictureTaken(byte[] data, Camera camera) {// 獲取Jpeg圖片,并保存在sd卡上 // buff = data;bitmap = Bytes2Bimap(data);mHandler.sendEmptyMessageDelayed(REFRESH_COMPLETE, 0);}};點(diǎn)擊拍照
imageView.setOnClickListener(new View.OnClickListener() {@Overridepublic void onClick(View v) {mCamera.autoFocus(new Camera.AutoFocusCallback() {@Overridepublic void onAutoFocus(boolean success, Camera camera) {// 從Camera捕獲圖片mCamera.takePicture(null, null, mPicture);}});} });二、.camera2.CameraDevice,TextureView實(shí)現(xiàn)自定義拍照。API=21以下的手機(jī)不可用,
(1)、layout.xml文件添加TextureView
<TextureViewandroid:id="@+id/tv_textview"android:layout_width="match_parent"android:layout_height="match_parent" />實(shí)現(xiàn)代碼比較長(zhǎng)篇。。。。。。。。
?
demo鏈接:https://download.csdn.net/download/meixi_android/11168640
?
1、創(chuàng)建自定義遮罩層view
/*** 人臉檢測(cè)區(qū)域View*/ public class FaceDetectRoundView extends View {private static final String TAG = FaceDetectRoundView.class.getSimpleName();public static final float SURFACE_HEIGHT = 1000f;public static final float SURFACE_RATIO = 0.75f;public static final float WIDTH_SPACE_RATIO = 0.33f;public static final float HEIGHT_RATIO = 0.1f;public static final float HEIGHT_EXT_RATIO = 0.2f;public static final int CIRCLE_SPACE = 5;public static final int PATH_SPACE = 16;public static final int PATH_SMALL_SPACE = 12;public static final int PATH_WIDTH = 4;public static final int COLOR_BG = Color.parseColor("#2F2F33");public static final int COLOR_RECT = Color.parseColor("#FFFFFF");public static final int COLOR_ROUND = Color.parseColor("#FFA800");private PathEffect mFaceRoundPathEffect = null;// new DashPathEffect(new float[]{PATH_SPACE, PATH_SPACE}, 1);private Paint mBGPaint;private Paint mPathPaint;private Paint mFaceRectPaint;private Paint mFaceRoundPaint;private Rect mFaceRect;private Rect mFaceDetectRect;private float mX;private float mY;private float mR;private boolean mIsDrawDash = true;public FaceDetectRoundView(Context context) {this(context, null);}public FaceDetectRoundView(Context context, AttributeSet attrs) {super(context, attrs);setLayerType(View.LAYER_TYPE_SOFTWARE, null);DisplayMetrics dm = context.getResources().getDisplayMetrics();float pathSpace = dip2px(context, PATH_SPACE);float pathSmallSpace = dip2px(context, PATH_SMALL_SPACE);float pathWidth = dip2px(context, PATH_WIDTH);mFaceRoundPathEffect = new DashPathEffect(new float[]{pathSpace, dm.heightPixels < SURFACE_HEIGHT? pathSmallSpace : pathSpace}, 1);mBGPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mBGPaint.setColor(COLOR_BG);mBGPaint.setStyle(Paint.Style.FILL);mBGPaint.setAntiAlias(true);mBGPaint.setDither(true);mPathPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mPathPaint.setColor(COLOR_ROUND);mPathPaint.setStrokeWidth(pathWidth);mPathPaint.setStyle(Paint.Style.STROKE);mPathPaint.setAntiAlias(true);mPathPaint.setDither(true);mFaceRectPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mFaceRectPaint.setColor(COLOR_RECT);mFaceRectPaint.setStrokeWidth(pathWidth);mFaceRectPaint.setStyle(Paint.Style.STROKE);mFaceRectPaint.setAntiAlias(true);mFaceRectPaint.setDither(true);mFaceRoundPaint = new Paint(Paint.ANTI_ALIAS_FLAG);mFaceRoundPaint.setColor(COLOR_ROUND);mFaceRoundPaint.setStyle(Paint.Style.FILL);mFaceRoundPaint.setXfermode(new PorterDuffXfermode(PorterDuff.Mode.CLEAR));mFaceRoundPaint.setAntiAlias(true);mFaceRoundPaint.setDither(true);}、、、、、、、、、、、、、
、、、、、、、
、、、、
2、添加自定義view方法
?
在activity中添加自定義遮罩層view即可實(shí)現(xiàn)
?
private FaceDetectRoundView mFaceView;?
mFaceView = new FaceDetectRoundView(this); mFaceView.setAlpha(0.43f); addContentView(mFaceView, new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT));demo云盤:https://pan.baidu.com/s/1n5zcprwVGUlLjLvVm0qjrw
在線bug交流:QQ1085220040
?
總結(jié)
以上是生活随笔為你收集整理的android 自定义相机,Camera,相机遮罩层的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: iphone6出信号 无服务器,苹果6手
- 下一篇: 结对-人机对战象棋游戏-开发过程