全网整合营销服务商

电脑端+手机端+微信端=数据同步管理

免费咨询热线:400-708-3566

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

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

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 


相关文章: Android使用GridView实现日历的简单功能  大同网页,大同瑞慈医院官网?  如何用VPS主机快速搭建个人网站?  如何高效配置香港服务器实现快速建站?  ,怎么用自己头像做动态表情包?  佛山企业网站制作公司有哪些,沟通100网上服务官网?  如何通过wdcp面板快速创建网站?  ,石家庄四十八中学官网?  网站插件制作软件免费下载,网页视频怎么下到本地插件?  建站主机是什么?如何选择适合的建站主机?  盘锦网站制作公司,盘锦大洼有多少5G网站?  安云自助建站系统如何快速提升SEO排名?  红河网站制作公司,红河事业单位身份证如何上传?  枣阳网站制作,阳新火车站打的到仙岛湖多少钱?  如何选择建站程序?包含哪些必备功能与类型?  建站主机是否等同于虚拟主机?  较简单的网站制作软件有哪些,手机版网页制作用什么软件?  小视频制作网站有哪些,有什么看国内小视频的网站,求推荐?  如何配置FTP站点权限与安全设置?  javascript中对象的定义、使用以及对象和原型链操作小结  h5网站制作工具有哪些,h5页面制作工具有哪些?  网页设计与网站制作内容,怎样注册网站?  我的世界制作壁纸网站下载,手机怎么换我的世界壁纸?  c++如何打印函数堆栈信息_c++ backtrace函数与符号名解析【方法】  如何通过智能用户系统一键生成高效建站方案?  外汇网站制作流程,如何在工商银行网站上做外汇买卖?  建站之星后台管理系统如何操作?  如何用狗爹虚拟主机快速搭建网站?  中山网站制作网页,中山新生登记系统登记流程?  网站图片在线制作软件,怎么在图片上做链接?  php条件判断怎么写_ifelse和switchcase的使用区别【对比】  济南企业网站制作公司,济南社保单位网上缴费步骤?  制作充值网站的软件,做人力招聘为什么要自己交端口钱?  西安制作网站公司有哪些,西安货运司机用的最多的app或者网站是什么?  jQuery 常见小例汇总  如何在Windows服务器上快速搭建网站?  Swift中循环语句中的转移语句 break 和 continue  *服务器网站为何频现安全漏洞?  青岛网站建设如何选择本地服务器?  广州商城建站系统开发成本与周期如何控制?  建站之星手机一键生成:多端自适应+小程序开发快速建站指南  购物网站制作费用多少,开办网上购物网站,需要办理哪些手续?  广东专业制作网站有哪些,广东省能源集团有限公司官网?  PHP正则匹配日期和时间(时间戳转换)的实例代码  广东企业建站网站优化与SEO营销核心策略指南  车管所网站制作流程,交警当场开简易程序处罚决定书,在交警网站查询不到怎么办?  如何在宝塔面板中创建新站点?  江苏网站制作公司有哪些,江苏书法考级官方网站?  建站之星下载版如何获取与安装?  建站之星代理平台如何选择最佳方案? 

您的项目需求

*请认真填写需求信息,我们会在24小时内与您取得联系。