先盗图一张(来自安卓官网),如图所示,无论屏幕是横屏竖屏,预览视图的中心点坐标一直都是(0,0),四个角的坐标也都固定如图所示,不会因为横竖屏而发生变化。从这张图可以看出:

1:聚焦以及测光的坐标和手指触摸的屏幕真实坐标所选坐标系是不同的,它的值在(-1000,1000)之间变化。

2:我们触摸到的是一个点,而聚焦及测光需要反馈给相机的是一个区域,所以就要以触摸点为中心来合理的选择一个区域。

另外要提到的一点是,聚焦及测光是相对独立的两个参数,可以设置不同区域,不仅如此,测光还可以同时选择多个区域,通过权重来分配这些区域的测光比重。

既然聚焦、测光与我们的手指在屏幕上的触摸点用的不是同一个坐标系,那就得通过一定方法来转化坐标,首先要做的是,给我们的预览VIEW设置onTouch事件,获取手指抬起时的坐标位置。之后将这个坐标按上图进行坐标系转换,并以转换后的坐标点为中心扩展一个合适的矩形区域,然后将这个区域传给对应的相机参数,返回给相机即可。核心代码如下(注意我的是固定竖屏,即AndroidManifest该页面方向设置为portrait,横屏时对于同一点获取到的点击坐标与此不同,但是聚焦以及测光的坐标横竖屏保持一致):

/*** 清除自动对焦*/private static void clearCameraFocus() {camera.cancelAutoFocus();parameters = camera.getParameters();parameters.setFocusAreas(null);parameters.setMeteringAreas(null);try {camera.setParameters(parameters);} catch (Exception e) {Log.e(TAG, "failed to set parameters.\n" + e);}}
        Rect focusRect = calculateTapArea(event.getX(), event.getY(), 1f);Rect meteringRect = calculateTapArea(event.getX(), event.getY(), 1f);// To start tap focus, should cancel auto focus first.List<Camera.Area> mFocusList = new ArrayList<>();mFocusList.add(new Camera.Area(focusRect, 1000));List<Camera.Area> mMeteringList = new ArrayList<>();mMeteringList.add(new Camera.Area(meteringRect, 1000));parameters = camera.getParameters();parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);// Setting new camera parameters to indicate focus area.if (parameters.getMaxNumFocusAreas() > 0) { // Check if it is safe to set focusArea.parameters.setFocusAreas(mFocusList);}if (parameters.getMaxNumMeteringAreas() > 0) { // Check if it is safe to set meteringArea.parameters.setMeteringAreas(mMeteringList);}camera.setParameters(parameters);
    private static Rect calculateTapArea(float x, float y, float coefficient) {int FOCUS_AREA_SIZE = 300;
//        //计算点击坐标点在新的坐标系中的位置Log.e(TAG, "focus position : " + x + " : " + y);int areaSize = Float.valueOf(FOCUS_AREA_SIZE * coefficient).intValue();int left = clamp(Float.valueOf((y / ScreenUtils.getScreenHeight()) * 2000 - 1000).intValue(), areaSize);int top = clamp(Float.valueOf(((ScreenUtils.getScreenWidth() - x) / ScreenUtils.getScreenWidth()) * 2000 - 1000).intValue(), areaSize);Log.d("CameraFocus", "measure width:" + previewSize.getWidth() + "  measure height:" + previewSize.getHeight());Log.d(TAG, "previewArea:" + left + "  " + top + " " + (left + areaSize) + " " + (top + areaSize));return new Rect(left, top, left + areaSize, top + areaSize);}
/*** 确保所选区域在合理范围内,不会超过边界值*/private static int clamp(int touchCoordinateInCameraReper, int focusAreaSize) {int result;if (Math.abs(touchCoordinateInCameraReper) + focusAreaSize  > 1000) {if (touchCoordinateInCameraReper > 0) {result = 1000 - focusAreaSize ;} else {result = -1000 + focusAreaSize ;}} else {result = touchCoordinateInCameraReper - focusAreaSize / 2;}return result;}

Android Camera聚焦区域和测光区域的设置相关推荐

  1. Android -- Camera聚焦流程

    Camera.java autoFocus()聚焦回调函数 @Overridepublic void autoFocus() {//记录当前聚焦开始时间mFocusStartTime = System ...

  2. 我心依旧之Android Camera模块FW/HAL3探学序

    前沿: 目前对于Android Camera软硬件技术发展的主流方向是高像素.高帧率.多摄像头.超强的ISP以及各种视频图形处理算法等等.当前主流的Android系统中较为常见的Camera模块还均是 ...

  3. Android Camera设置setPreviewCallback实现onPreviewFrame接口实时截取每一帧视频流数据

    1 概述 通过Android Camera拍摄预览中设置setPreviewCallback实现onPreviewFrame接口,实时截取每一帧视频流数据 2 知识点 ① Android Camera ...

  4. android自定义camera预览区域,android camera摄像surfaceview预览界面特定区域(该区域可移动)...

    1.自定义一个imageview用来设定surfaceview上的特定区域. public class DrawImageView extends ImageView { private Paint ...

  5. 【Android RTMP】Android Camera 视频数据采集预览 ( 图像传感器方向设置 | Camera 使用流程 | 动态权限申请 )

    文章目录 安卓直播推流专栏博客总结 一. Camera 传感器方向简介 二. Camera 图像传感器横向显示数据 三. Camera 图像传感器纵向显示数据 四. 设置 Camera 预览数据方向 ...

  6. 【Android RTMP】Android Camera 视频数据采集预览 ( 视频采集相关概念 | 摄像头预览参数设置 | 摄像头预览数据回调接口 )

    文章目录 安卓直播推流专栏博客总结 一. Android 端数据采集涉及到的相关概念 二. Camera 预览图像尺寸设置 三. 获取摄像头采集的数据格式 安卓直播推流专栏博客总结 Android R ...

  7. Android Camera开发系列:设置对焦模式模式

    你对android camera的对焦模式熟悉吗? 知道什么场景下该设置哪种对焦模式吗? 本文针对下面2点展开介绍,和大家一起学习~ 一.有哪几种对焦模式? 二.如何使用各种对焦模式? 一.有哪几种对 ...

  8. Android camera(4)---Android Camera开发之基础知识篇

    Android Camera开发之基础知识篇 转自:https://blog.csdn.net/feiduclear_up/article/details/51968975#jump5 概述 Andr ...

  9. android camera (2) ---高通平台camera开发

    1. 设置摄像头方向 2. 打开线程与预览线程 3. 设置参数 4. Camera外设按键 5. 自动对焦与触摸对焦 6. 拍照 7. 人脸检测 8. 位置管理 9. 旋转管理 10. 变焦 11. ...

  10. Camera HAL3学习: Android Camera System

    Android Camera硬件抽象层(HAL,Hardware Abstraction Layer)主要用于把底层camera drive与硬件和位于android.hardware中的framew ...

最新文章

  1. php 优化sql,php – 优化此SQL查询
  2. dxf geojson 转换_将Geopandas中geojson文件的linestring转换为polygon
  3. python控制51单片机的红绿灯_基于51单片机的红绿灯实现(使用普中科技开发板)...
  4. java windows linux 乱码_Linux 中 Windows 中文乱码
  5. Notification使用详解之四:由后台服务向Activity发送进度信息
  6. linux怎么看文件是否orc格式,hive文件存储格式orc,parquet,avro对比
  7. 什么样的固定资产管理系统才能满足企业需求
  8. Visual C++网络编程经典案例详解 第5章 网页浏览器 CHtmlView类 实现查看源文件功能步骤
  9. 深度学习服务器?深度了解一下!
  10. python中sys模块下载_怎样进行python sys模块安装及使用
  11. 什么是Bom,常用的bom属性又有哪些?
  12. 深度学习LSTM框架图PPT高清
  13. python可视化之matplotlib绘图--蜘蛛侠钢铁侠(组合分区绘图)
  14. vscode 插入多个光标,实现同时多行编辑的快捷键
  15. AI带你省钱旅游!精准预测民宿房源价格! ⛵
  16. 2018/09/27Web前端学习第三课
  17. 【Git】团队协作(终于学会了)
  18. AM的常用T-CODE
  19. MongoDB学习系列 -- 数据库、集合、文档的CURD
  20. 报警系统QuickAlarm之报警规则的设定与加载

热门文章

  1. Android,iOS应用适配IPv6之网络配置
  2. 江苏省领航杯人工智能竞技人车协同赛项记录
  3. 服务器远程连接端口号修改
  4. www.skymaya.com:8080/index.php,skymaya
  5. Linux基础内容介绍
  6. 局域网服务器时间修改,局域网内建立时间同步
  7. Python实例——国际标准书号(ISBN)的计算
  8. chrome 打开默认页 被篡改_Chrome谷歌浏览器主页总被篡改怎么解决?
  9. golang-ffmpeg-goav拉流解码器,支持视频拉流解码并转换为YUV、BGR24或RGB24等图像像素数据
  10. dell进入u盘启动模式_戴尔主板bios设置u盘启动