关于自定义相机预览界面拉伸问题

1、导致主要变形的原因是Camera预览界面旋转的角度和摄像头挂载的角度不同导致的
2、我们的Activity设置的方向是竖屏,这是手机的自然方向 所以宽比高短
3、角度:所谓屏幕和摄像头的角度,指的是相对于自然方向旋转过的角度,根据旋转角度即可获知当前的方向
4、假如说:手机是竖屏的情况下, 自然角度为0,但是Camera逆时针旋转90度,那咱们设置顺时针旋转90度,就正常 。手机是横屏的情况下Camera返回为0度 ,如果设置顺时针旋转90度,就回旋转
怎么设置预览界面与实景保持一致的方法,官方给出的文档:
public static void setCameraDisplayOrientation(Activity activity,int cameraIo, Camera camera){
Camera.CameraInfo info=new Camera.CameraInfo();
Camera.getCameraInfo(cameraIo,info);
int rotation=activity.getWindowManager().getDefaultDisplay().getRotation();
int degress=0;
switch(rotation){
case Surface.ROTATION_0:
degress=0;
break;
case Surface.ROTATION_90:
degress=90;
break;
case Surface.ROTATION_180:
degress=180;
break;
case Surface.ROTATION_270:
degress=270;
break;
}
int result;
if(info.facing=Camera.CameraInfo.CAMERA_FACING_FRONT){
result = (info.orientation + degrees) % 360;
> 就是摄像头需要顺时针转过多少度才能恢复自然方向
result = (360 - result) % 360;
} else { // back-facing
result = (info.orientation - degrees + 360) % 360;
}
camera.setDisplayOrientation(result);
switch (result) {
case 0:
case 180:
setCameraSize(camera.getParameters(), getScreenWidth(), getScreenHeight());
break;
case 90:
case 270:
setCameraSize(camera.getParameters(), getScreenHeight(), getScreenWidth());
break;
}
}
public static void setCameraSize(Camera.Parameters parameters, int width, int height) {
Map<String, List<Size>> allSizes = new HashMap<>();
String typePreview = "typePreview";
String typePicture = "typePicture";
allSizes.put(typePreview, parameters.getSupportedPreviewSizes());
allSizes.put(typePicture, parameters.getSupportedPictureSizes());
Iterator iterator = allSizes.entrySet().iterator();
while (iterator.hasNext()) {
Map.Entry<String, List<Size>> entry = (Map.Entry<String, List<Size>>) iterator.next();
List<Size> sizes = entry.getValue();
if (sizes == null || sizes.isEmpty()) continue;
ArrayList<WrapCameraSize> wrapCameraSizes = new ArrayList<>(sizes.size());
for (Size size : sizes) {
WrapCameraSize wrapCameraSize = new WrapCameraSize();
wrapCameraSize.setWidth(size.width);
wrapCameraSize.setHeight(size.height);
wrapCameraSize.setD(Math.abs((size.width - width)) + Math.abs((size.height - height)));
if (size.width == width && size.height == height) {
if (typePreview.equals(entry.getKey())) {
parameters.setPreviewSize(size.width, size.height);
} else if (typePicture.equals(entry.getKey())) {
parameters.setPictureSize(size.width, size.height);
}
Log.d(TAG, "best size: width=" + size.width + ";height=" + size.height);
break;
}
wrapCameraSizes.add(wrapCameraSize);
}
Log.d(TAG, "wrapCameraSizes.size()=" + wrapCameraSizes.size());
Size resultSize = null;
if (typePreview.equals(entry.getKey())) {
resultSize = parameters.getPreviewSize();
} else if (typePicture.equals(entry.getKey())) {
resultSize = parameters.getPictureSize();
}
if (resultSize == null || (resultSize.width != width && resultSize.height != height)) {
//找到相机Preview Size 和 Picture Size中最适合的大小
if(wrapCameraSizes.isEmpty()) continue;
WrapCameraSize minCameraSize = Collections.min(wrapCameraSizes);
while (!(minCameraSize.getWidth() >= width && minCameraSize.getHeight() >= height)) {
wrapCameraSizes.remove(minCameraSize);
if(wrapCameraSizes.isEmpty()) break;
minCameraSize = null;
minCameraSize = Collections.min(wrapCameraSizes);
}
Log.d(TAG, "best min size: width=" + minCameraSize.getWidth() + ";height=" + minCameraSize.getHeight());
if (typePreview.equals(entry.getKey())) {
parameters.setPreviewSize(minCameraSize.getWidth(), minCameraSize.getHeight());
} else if (typePicture.equals(entry.getKey())) {
parameters.setPictureSize(minCameraSize.getWidth(), minCameraSize.getHeight());
}
}
iterator.remove();
}
}
先将获取手机支持预览的尺寸列表通过parmeters.getSupportPreviewSize返回的是一个集合。
进行屏幕方向的判断,因为预览的尺寸都是w>h 如果是竖屏,则需要将宽和高进行调换。
将预览尺寸列表的每个元素的宽和高与SurfaceView的宽和高进行比较,如果存在宽和高尺寸SurfaceView的宽和高,相同的size,则将当前的宽高设置为预览尺寸。
如果没有找到该步骤,则将尺寸列表的比例和SUrfaceView的比例做比较,找一个相同或者相近的 。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
# Android相机预览界面拉伸
# Android相机界面拉伸
# Android预览界面拉伸
# Android Camera1实现预览框显示
# Android CameraX打开摄像头预览教程
# Android CameraX 打开摄像头预览功能
# Android Camera2 实现预览功能
# Android实现Camera2预览和拍照效果
# Android camera实时预览 实时处理
# 人脸识别示例
# Android编程中调用Camera时预览画面有旋转问题的解决方法
# Android仿微信照片选择器实现预览查看图片
# android 7自定义相机预览及拍照功能
# Android Camera2实现最简单的预览框显示
# 顺时针
# 比高
# 则将
# 的是
# 都是
# 这是
# 情况下
# 自定义
# 要将
# 找一个
# 最适合
# 设置为
# 指的是
# 没有找到
# 先将
# 大家多多
# 就回
# 则需
# 文档
# Surface
相关文章:
建站之星在线客服如何快速接入解答?
建站之星如何通过成品分离优化网站效率?
如何在万网ECS上快速搭建专属网站?
如何通过VPS建站实现广告与增值服务盈利?
沈阳制作网站公司排名,沈阳装饰协会官方网站?
如何在景安服务器上快速搭建个人网站?
盐城做公司网站,江苏电子版退休证办理流程?
北京网站制作的公司有哪些,北京白云观官方网站?
建站OpenVZ教程与优化策略:配置指南与性能提升
武汉网站如何制作,黄黄高铁武穴北站途经哪些村庄?
贸易公司网站制作流程,出口贸易网站设计怎么做?
香港代理服务器配置指南:高匿IP选择、跨境加速与SEO优化技巧
北京建设网站制作公司,北京古代建筑博物馆预约官网?
C++如何将C风格字符串(char*)转换为std::string?(代码示例)
如何在IIS中配置站点IP、端口及主机头?
如何通过山东自助建站平台快速注册域名?
长沙企业网站制作哪家好,长沙水业集团官方网站?
怎么将XML数据可视化 D3.js加载XML
建站主机服务器选购指南:轻量应用与VPS配置解析
如何选择适合PHP云建站的开源框架?
专业网站建设制作报价,网页设计制作要考什么证?
已有域名能否直接搭建网站?
全景视频制作网站有哪些,全景图怎么做成网页?
如何快速搭建高效服务器建站系统?
如何选择高性价比服务器搭建个人网站?
极客网站有哪些,DoNews、36氪、爱范儿、虎嗅、雷锋网、极客公园这些互联网媒体网站有什么差异?
如何在阿里云虚拟主机上快速搭建个人网站?
宝华建站服务条款解析:五站合一功能与SEO优化设置指南
c# 在ASP.NET Core中管理和取消后台任务
大连网站制作公司哪家好一点,大连买房网站哪个好?
Bpmn 2.0的XML文件怎么画流程图
深入理解Android中的xmlns:tools属性
网站设计制作书签怎么做,怎样将网页添加到书签/主页书签/桌面?
如何在新浪SAE免费搭建个人博客?
企业微网站怎么做,公司网站和公众号有什么区别?
零基础网站服务器架设实战:轻量应用与域名解析配置指南
如何在Golang中实现微服务服务拆分_Golang微服务拆分与接口管理方法
如何在沈阳梯子盘古建站优化SEO排名与功能模块?
如何选择最佳自助建站系统?快速指南解析优劣
宝塔建站教程:一键部署配置流程与SEO优化实战指南
建站之星如何助力企业快速打造五合一网站?
南京做网站制作公司,南京哈发网络有限公司,公司怎么样,做网页美工DIV+CSS待遇怎么样?
如何在服务器上配置二级域名建站?
整人网站在线制作软件,整蛊网站退不出去必须要打我是白痴才能出去?
如何通过建站之星自助学习解决操作问题?
Python lxml的etree和ElementTree有什么区别
手机钓鱼网站怎么制作视频,怎样拦截钓鱼网站。怎么办?
网站制作知乎推荐,想做自己的网站用什么工具比较好?
已有域名和空间如何快速搭建网站?
,在苏州找工作,上哪个网站比较好?
*请认真填写需求信息,我们会在24小时内与您取得联系。