前言

  Camera1的自动对焦还是有一些坑值得开一个篇幅来讲解,一般对焦Mode有以下几种:

  •   Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 连续自动对焦视频
  •   Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE  连续自动对焦图像
  •   Camera.Parameters.FOCUS_MODE_AUTO 自动对焦(单次)

检查支持的对焦Mode

有些时候前摄像头不支持一些对焦模式,所以我们在切换摄像头后配置摄像就需要检查一遍支持的对焦模式

  1. List<String> focusModeList = parameters.getSupportedFocusModes();
  2. for (String focusMode : focusModeList){//检查支持的对焦
  3. if (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){
  4. parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
  5. }else if (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
  6. parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
  7. }
  8. }

FLASH_MODE_AUTO设置自动对焦Mode

其他对焦模式并没有上面好说的使用后会一直自动对焦,但是FLASH_MODE_AUTO对焦比较独特,它其实调用一次才触发一次的对焦.

  1. Camera.Parameters parameters = mCamera.getParameters();
  2. parameters.setFocusMode(Camera.Parameters.FLASH_MODE_AUTO); //对焦设置为自动
  3. //其他参数配置略...
  4. mCamera.setParameters(parameters);//添加参数

很简单在配置Camera1的时候调用setFocusMode(Camera.Parameters.FLASH_MODE_AUTO) 实现自动对焦

启用自动对焦

在上面将对焦设置为自动模式后,并不是真的就自动对焦(自动对焦的意思其实是当前屏幕中心的画面自动对焦),所以我们需要触发一次对焦.

  1. mCamera.setPreviewTexture(surface);
  2. mCamera.startPreview();
  3. mCamera.autoFocus(new Camera.AutoFocusCallback() {
  4. @Override
  5. public void onAutoFocus(boolean success, Camera camera) {
  6.  
  7. }
  8. });

注意!对焦是需要在预览开始之后才能调用的,否则报错.以上设置一次autoFocus 就等于对焦一次.注意!是只对焦一次! 它不是一直在对焦!

FLASH_MODE_AUTO实现主动对焦和被动对焦的思路

被动对焦的思路

被动对焦的思路很简单,用一个Button或者点击预览View进行一次对焦,所以,正常开发的情况下,需要使用一个布尔值来判断当前是不是在预览状态.

主动对焦

也很简单写一个Handler循环就行了,我下面的例子就是每隔2秒对焦一次

  1. private Handler mHandler = new Handler(){
  2. @Override
  3. public void handleMessage(Message msg) {
  4. super.handleMessage(msg);
  5. switch (msg.what){
  6. case 0x01:
  7. mCamera.autoFocus(new Camera.AutoFocusCallback() {
  8. @Override
  9. public void onAutoFocus(boolean success, Camera camera) {
  10.  
  11. }
  12. });
  13. mHandler.sendEmptyMessageDelayed(0x01,2*1000);
  14. break;
  15. default:
  16. break;
  17. }
  18. }
  1. mTextureview.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
  2. @Override
  3. public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
  4. initCamera();
  5. initCameraConfig();
  6. try {
  7. mCamera.setPreviewTexture(surface);
  8. mCamera.startPreview();
  9. mHandler.sendEmptyMessage(0x01);
  10. } catch (IOException e) {
  11. e.printStackTrace();
  12. }
  13.  
  14. }
  15.  
  16. @Override
  17. public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
  18.  
  19. }
  20.  
  21. @Override
  22. public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
  23. return false;
  24. }
  25.  
  26. @Override
  27. public void onSurfaceTextureUpdated(SurfaceTexture surface) {
  28.  
  29. }
  30. });

Android 开发 Camera1_如何使用对焦功能的更多相关文章

  1. Android 开发自己的网络收音机1——功能要求及设计方案

    最近打算利用业余时间,编写一个Android的网络收音机.因为我自己偶尔也喜欢听听广播,所以打算用业余时间编写一个网络版收音机.说起收音机,其实在工作中已经编写过一个,不过那个收音机是需要硬件支持,也 ...

  2. Android 开发 框架系列 OkHttp文件下载功能实现(含断点续传)

    前言 此篇博客只是下载功能的记录demo,如果你还不太了解okhttp可以参考我的另一篇博客https://www.cnblogs.com/guanxinjing/p/9708575.html 代码部 ...

  3. Android开发-记账本-实现记账功能选择

    制作GridView适配器,实现页面数据的变化 制作类型存储数据库,存储的主要是图片类型,类型被选中时的图片,类型未被选中时的图片. 数据库代码如下 package com.example.Utils ...

  4. Android开发之自己主动登录功能的实现

    在我们平时使用的手机应用都能够实现仅仅须要登陆一次账号后,第二次进入应用直接跳转到效果界面的效果,还有QQ的登陆框是怎样记忆我们的隐身登陆,保存账号选项的呢,这些都是通过使用SharedPrefere ...

  5. android 开发 View _9_ 实现渐变功能(直线与圆形)

    参考博客:https://blog.csdn.net/iispring/article/details/50500106/ android颜色渐变的分类有: LinearGradient线性渐变 线性 ...

  6. Android开发之实现锁屏功能

    锁屏须要引入设备超级管理员.在文档Android开发文档的Administration中有具体的说明. Android设备管理系统功能和控制訪问. 主要有一下几个步骤: 1  创建广播接收者,实现De ...

  7. android 开发 讯飞语音唤醒功能

    场景:进入程序后处于语音唤醒状态,当说到某个关键词的时候打开某个子界面(如:语音识别界面) 技术要点: 1. // 设置唤醒一直保持,直到调用stopListening,传入0则完成一次唤醒后,会话立 ...

  8. android 开发 View _1_ View的子类们 和 视图坐标系图

    目录: android 开发 View _2_ View的属性动画ObjectAnimator ,动画效果一览 android 开发 View _3_ View的属性动画ValueAnimator a ...

  9. Android 开发自己的网络收音机4——读取XML文件的电台数据

    国内外的电台数据很多,起码有好几百,所以把这些数据都写到代码里面是不实际的.只能写成一个数据文件,程序启动的时候再去加载.保存这些简单数据,我们肯定会优先使用XML文件,今天讲讲如何读取XML里面的数 ...

随机推荐

  1. nlp总结

    中科院nlpir和海量分词(http://www.hylanda.com/)是收费的. hanlp:推荐基于CRF的模型的实现~~要看语料,很多常用词会被分错,所以需要词库支撑.目前最友好的开源工具包 ...

  2. UVA 10382 Watering Grass 贪心+区间覆盖问题

    n sprinklers are installed in a horizontal strip of grass l meters long and w meters wide. Each spri ...

  3. 数据库和java Bean

    ·1. 数据库和java Bean,字段类型要一致.不一致查询不出来,但不会报错. 字段名称也一样,不一致查询不出来,但不会报错. 2. 数据库和java Bean字段的个数可以不一样,也不会包错 3 ...

  4. mysql8以上版本时区问题:The server time zone value乱码XXXX

    异常类似: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. ...

  5. pytong下安装安装SK-Learn

    安装SK-Learn需要依赖的Python安装包有: Python (>= 2.6), NumPy (>= 1.3), SciPy (>= 0.7), 下载python的各种包的地址 ...

  6. USACO2005 Cow Acrobats /// 前缀和 oj23402

    题目大意: N (1 ≤ N ≤ 50,000)头牛叠罗汉 找到最优排序使所有牛的风险值总和最小 每头牛重量 (1 ≤ Wi ≤ 10,000) 力量 (1 ≤ Si ≤ 1,000,000,000) ...

  7. Winform 获取桌面设备上下文

    //获得桌面设备上下文 us(Graphics g = Graphics.FromHwnd(IntPtr.Zero)) { g.DrawLine(Pens.Red, , , , ); }

  8. IOS中iframe的滚动条不启作用

    引自:https://www.cnblogs.com/weinan/archive/2013/01/05/2832800.html 问题描述: iframe设置了高度(例如500px).倘若ifram ...

  9. SpringCloud学习笔记《---04 Feign---》基础篇

  10. C 终端输入 字符123 输出 10进制123

    #include <stdio.h> #define N 20 int main(int argc, const char *argv[]) { char a[N] = {'\0'}; i ...