基础内容可参考

自动对焦系统概述|Camera

https://jingyan.baidu.com/article/22a299b5c882a29e19376aad.html

对焦框坐标基本概念:

Android Camera2之 手动点击区域对焦 - 简书

Camera2点击对焦实现 - mydddfly - 博客园

本文主要总结自己开发过程中遇到的各个知识点

需求: Camera2  App开发:取消自动对焦,设置为触摸手动对焦,对焦完成后依然不允许自动对焦

思路:

触摸屏幕OnTouchListener监听--》根据坐标转换,计算对焦区域--》进行对焦--》显示对焦框

1、触摸屏幕,

private View.OnTouchListener mOntouchListener = new View.OnTouchListener() {@Overridepublic boolean onTouch(View view, MotionEvent event) {try {switch(event.getAction()){case MotionEvent.ACTION_DOWN:int[] location = new int[2];mTextureView[0].getLocationOnScreen(location);int tmpx = mTextureView[0].getWidth();int tmpy = mTextureView[0].getHeight();Log.d(TAG, "onTouch,TextureView.getWidth:" + tmpx +",TextureView.getHeight:" + tmpy + ",location[0]:" + location[0] +",location[1]" + location[1] + ",TextureView.getLeft:" + mTextureView[0].getLeft()+ ",TextureView.getTop:" + mTextureView[0].getTop()+", mTextureView[0].getRight():"+ mTextureView[0].getRight()+", mTextureView[0].getBottom():"+ mTextureView[0].getBottom());int focusWidth = mAutoFoucView.getLayoutParams().width;int focusHeight = mAutoFoucView.getLayoutParams().height;float x_raw = event.getRawX();//between screenfloat y_raw = event.getRawY();//between screenmAutoFoucView.setVisibility(View.VISIBLE);ViewGroup.MarginLayoutParams layoutParams = (ViewGroup.MarginLayoutParams) mAutoFoucView.getLayoutParams();
//                        int left = (int) (event.getX() - focusWidth / 2 + location[0]);
//                        int top = (int) (event.getY() - focusHeight / 2 + location[1]);int left = (int) (event.getX() - focusWidth / 2);int top = (int) (event.getY() - focusHeight / 2);Log.d(TAG, "onTouch,focusWidth:" + focusWidth +",focusHeight:" + focusHeight + ",event.getX():" + event.getX() +",event.getY():" + event.getY() + ",event.getRawX():" + event.getRawX()+ ",event.getRawY():" + event.getRawY());layoutParams.leftMargin = left;layoutParams.topMargin = top;mAutoFoucView.setLayoutParams(layoutParams);mAutoFoucView.prepareFocus();int width = mTextureView[0].getWidth();int height = mTextureView[0].getHeight();meteringRectangle = getMeteringRectangles(event.getX(), event.getY(), width, height);Message msg = Message.obtain();msg.what = CameraOpt.MSG_SET_TOUCH_POINT_VALUE;msg.obj= meteringRectangle;msg.arg1 = mAutoFoucView.isFocusing()? 1 : 0;mCameraOpt[0].getHandler().sendMessage(msg);break;}return true;} catch (Exception e) {Log.v("onTouch", e.toString());return false;}}};
                case MSG_SET_TOUCH_POINT_VALUE:meteringRectangle =(MeteringRectangle[]) msg.obj;isFocusing = msg.arg1 != 0;//Log.i(TAG,"isFocusing="+isFocusing);onTouchFoucs(meteringRectangle);break;
    private void onTouchFoucs(MeteringRectangle[] meteringRectangle) {if(isFocusing){
//设置AF/AE对焦区域,开始对焦mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_REGIONS, meteringRectangle);mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_AUTO);mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_START);mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_REGIONS, meteringRectangle);//        mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);mPreviewRequest = mPreviewRequestBuilder.build();try {mCaptureSession.setRepeatingRequest(mPreviewRequest, mPreviewListener, mHandler);} catch (CameraAccessException e) {Log.e(TAG, "setRepeatingRequest failed, " + e.getMessage());}}}
private final CameraCaptureSession.CaptureCallback mPreviewListener = new CameraCaptureSession.CaptureCallback() {@Overridepublic void onCaptureCompleted(CameraCaptureSession session, CaptureRequest request, TotalCaptureResult result) {Log.d(TAG, "onCaptureCompleted begin isFocusing="+isFocusing);if (mPreviewRequestBuilder == null) {return;}if(isFocusing){Integer afState = result.get(CaptureResult.CONTROL_AF_STATE);//Log.d(TAG, "onCaptureCompleted begin afState="+afState);if (CaptureResult.CONTROL_AF_STATE_FOCUSED_LOCKED == afState|| CaptureResult.CONTROL_AF_STATE_NOT_FOCUSED_LOCKED == afState) {isFocusSucess = true;mCamLister.onFocusState(isFocusSucess);mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CameraMetadata.CONTROL_AF_TRIGGER_CANCEL);//如果对焦完成后不允许自动对焦,注释掉如下几行。
//                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_TRIGGER, CaptureRequest.CONTROL_AF_TRIGGER_IDLE);
//                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AF_MODE, CaptureRequest.CONTROL_AF_MODE_CONTINUOUS_PICTURE);
//                    mPreviewRequestBuilder.set(CaptureRequest.CONTROL_AE_MODE, CaptureRequest.CONTROL_AE_MODE_ON);mPreviewRequest = mPreviewRequestBuilder.build();try {mCaptureSession.setRepeatingRequest(mPreviewRequest, null, mHandler);//} catch (CameraAccessException e) {Log.e(TAG, "setRepeatingRequest failed, errMsg: " + e.getMessage());}}else {isFocusSucess = false;mCamLister.onFocusState(isFocusSucess);}}isFocusing = false;super.onCaptureCompleted(session, request, result);
//            Log.d(TAG, mCameraId + " onCaptureCompleted end");}@Overridepublic void onCaptureStarted(CameraCaptureSession session, CaptureRequest request, long timestamp, long frameNumber) {super.onCaptureStarted(session, request, timestamp, frameNumber);}@Overridepublic void onCaptureFailed(CameraCaptureSession session, CaptureRequest request, CaptureFailure failure) {super.onCaptureFailed(session, request, failure);}};

mPreviewListener是监听预览界面;

getMeteringRectangles函数后面补充

camera 自动对焦手动对焦相关推荐

  1. Camera自动对焦

    private MyAutoFocus mAutoFocus = new MyAutoFocus(); //自动对焦方法class MyAutoFocus implements AutoFocusCa ...

  2. [Android编程心得] Camera(OpenCV)自动对焦和触摸对焦的实现

    http://blog.csdn.net/candycat1992/article/details/21617741 实现 以OpenCV的JavaCameraView为例,首先需要定制自己的Came ...

  3. 基于GLSurfaceView实现自定义Camera

    Android中的Camera简介 这里主要将一些camera的一些简单用法,当然如果是用camera2的童鞋,可以参考:http://blog.csdn.net/vinicolor/article/ ...

  4. 相机镜头上的所有字母,首字母缩写和数字代表什么?

    A quick peek at the barrel of your camera's lens reveals a jungle of letters, numbers, and acronyms. ...

  5. php七牛云rtmp直播推流,GitHub - jangocheng/FlutterQiniucloudLivePlugin: Flutter 七牛云直播云 推流/播放 SDK集成...

    flutter_qiniucloud_live_plugin Flutter 七牛云直播云插件,支持IOS.Android客户端 Getting Started 集成七牛云直播云推流.观看等功能 功能 ...

  6. OCR实时扫描识别中英文--tess_two在Android的使用

    本篇博客是有了实时扫描识别的需求,然后看到了一篇博客,在其基础上按项目需求改进而成.感谢Si-Kang的贡献,基于交流进步的想法这里把我处理的一些问题写出来 转载地址:http://blog.csdn ...

  7. Android视频编辑器(一)通过OpenGL预览、录制视频以及断点续录等

    前言 如今的视频类app可谓是如日中天,火的不行.比如美拍.快手.VUE.火山小视频.抖音小视频等等.而这类视频的最基础和核心的功能就是视频录制和视频编辑功能.包括了手机视频录制.美白.加滤镜.加水印 ...

  8. 相机镜头工作原理图解

    本文目录 (一)机身 (二)关于镜头 一.如何平衡机身与镜头的预算 二.镜头的作用 三.镜头的组成部分 四.关于焦距 什么是焦距? 为什么焦距很重要? 五.变焦与定焦镜头 六.光圈及最大光圈 光圈如何 ...

  9. 富士相机设置传原图_【投稿】富士X摄影师鲜为人知的相机设置技巧

    原标题:[投稿]富士X摄影师鲜为人知的相机设置技巧 很多摄影爱好者买了一部相机之后,首先要熟悉相机的菜单和各项功能,系统的学习摄影基础,在这个过程中你会发现,相机的默认设置有悖于我们的实际使用习惯,那 ...

  10. Android Ocr文字识别 身份证识别 实时扫描

    遇到一个需求需要扫描身份证,识别身份证号并进行查询,在网上百度需要用到文字识别技术,ocr tess-two,看到网上有关于中英文实时扫描和手机号实时扫描的功能,于是在这两者的基础上进行了改进,感谢顾 ...

最新文章

  1. 估算神经网络卷积核数量的近似方法
  2. 分布式计算的模式语言读后感
  3. 【PHP】常用日期函数
  4. svm常用核函数及选择核函数的方法
  5. QT的QGraphicsItemGroup类的使用
  6. python 接口编程_Python 中的面向接口编程
  7. 前端学习(2934):上午回顾
  8. vue swiper循环播放无效解决
  9. 【转】使用Azure Rest API获得Access Token介绍
  10. CAN总线技术 | CAN脱颖而出的“秘密”
  11. android 推送的小图标,android - 推送通知中没有声音并且没有自定义的小图标 - 堆栈内存溢出...
  12. 卖不动了,5G资费套餐再降价,网友:再等等再等等
  13. 【kafka】kafka 消息 重放 从 一个 topic 导入 另外一个 topic
  14. mysql 浮点型详解 简书_MySQL数据类型;基本操作
  15. CIO,马上就没有线下灾备了,不要做最后一个
  16. USB转TTL接线方法
  17. SpringBoot接入微信公众号模板消息推送
  18. 「网络流 24 题」火星探险问题。
  19. (七)DAC0832 数模转换芯片的应用 以及运算放大器的学习 01
  20. 软负载和硬负载的区别分析

热门文章

  1. 6 生僻字_抖音《生僻字》的字词成语解释完整版
  2. cαr怎么发音_元音字母
  3. 男人养肾按摩运动更可取
  4. mysql 1236 bug_【转】MySQL主从失败 错误Got fatal error 1236解决方法
  5. 新唐 Nuvoton M031 入门 点亮板载LED
  6. Tech Talk| Redmi K50 电竞版手机极致散热技术详解
  7. salt自定义returner+fluent+mysql进行数据采集
  8. 拳皇世界服务器维护,拳皇世界3月1日更新维护公告 多组服务器开启数据互通[图]...
  9. 过滤器把样式过滤掉,无法显示样式问题, 处理方法
  10. 上网代理设置会被自动清空_每次开机IE代理服务器都被恶意设置,删除了,下次开机又出现,反反复复。我从没设置过它...