# CircleCameraPreview **Repository Path**: wmcyf/CircleCameraPreview ## Basic Information - **Project Name**: CircleCameraPreview - **Description**: No description available - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 1 - **Forks**: 0 - **Created**: 2021-03-24 - **Last Updated**: 2021-09-02 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 相机圆形窗口预览 ***言不如一图...*** ![效果图](./img/demo.png) 如果老铁还可以,不用请我和阔乐,不入就给我的个小星星 O_O [源码地址 . GitHub](https://github.com/Trisia/CircleCameraPreview) ## Quick Start 引入依赖 ``` implementation 'com.github.cliven.circlecamerapreview:circlecamerapreview:1.0.4' ``` > 引用依赖`Gralde 4.0 `以前版本 > ``` > compile 'com.github.cliven.circlecamerapreview:circlecamerapreview:1.0.4' > ``` 在xml中引用组件 ```xml ``` > 注意: > > - `width` 和 `height` 比例必须尽可能为 1:1,在真正绘制时可能会动态调整 `width` 和 `height` > - `background` 必须设置,某则无法显示圆形,建议设置为透明`@android:color/transparent` --- `AndroidManifest.xml` 加入相机使用权限 ```xml ``` 确保程序在调用时能够授权 ``` private static final String[] NEEDED_PERMISSION = {Manifest.permission.CAMERA}; if (ContextCompat.checkSelfPermission(this.getApplicationContext(), NEEDED_PERMISSION[0]) != PackageManager.PERMISSION_GRANTED) { // 没有相机权限则停止运行 ActivityCompat.requestPermissions(this, NEEDED_PERMISSION, REQ_CODE); return; } ``` ## 原理 > **请结合 [CircleCameraPreview 源码](https://github.com/Trisia/CircleCameraPreview/blob/master/circlecamerapreview/src/main/java/com/github/cliven/circlecamerapreview/CircleCameraPreview.java) 阅读下面内容** 1. 在xml中引用组件设置 宽高比为 1:1,背景为透明。 2. 找到相机支持最大的 4:3比例(该比例应该与)的照片尺寸,设置相机参数。 3. 根据相机和屏幕角度,动态调整view的`width` 和 `height`以适应图片比例,防止预览图片失真。 4. 重写SurfaceView的`onMeasure`,计算出圆形的半径和真正的宽高像素。 ```java protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { super.onMeasure(widthMeasureSpec, heightMeasureSpec); // 坐标转换为实际像素 int widthSize = MeasureSpec.getSize(widthMeasureSpec); int heightSize = MeasureSpec.getSize(heightMeasureSpec); // 计算出圆形的中心点, 右移动1位等价于除2 centerPoint = new Point(widthSize >> 1, heightSize >> 1); // 计算出最短的边的一半作为半径 radius = (widthSize >> 1 > heightSize >> 1) ? heightSize >> 1 : widthSize >> 1; setMeasuredDimension(widthSize, heightSize); } ``` 5. 重写SurfaceView的`draw`方法,在绘制之前,首先创建圆形路径并进行裁剪。 ```java public void draw(Canvas canvas) { if (clipPath == null) { clipPath = new Path(); //设置裁剪的圆心,半径 clipPath.addCircle(centerPoint.x, centerPoint.y, radius, Path.Direction.CCW); } //裁剪画布,并设置其填充方式 canvas.clipPath(clipPath, Region.Op.REPLACE); super.draw(canvas); } ``` > 如果解决了你的问题不如给我点个赞吧。 ## 致谢 [1]. [CSDN . minyou_1314 . https://blog.csdn.net/minyou_1314/article/details/50971866](https://blog.csdn.net/minyou_1314/article/details/50971866)