• Android 开发 Camera1_如何使用对焦功能


    前言

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

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

    检查支持的对焦Mode

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

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

    FLASH_MODE_AUTO设置自动对焦Mode

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

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

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

    启用自动对焦

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

    mCamera.setPreviewTexture(surface);
    mCamera.startPreview();
    mCamera.autoFocus(new Camera.AutoFocusCallback() {
            @Override
            public void onAutoFocus(boolean success, Camera camera) {
    
            }
        });        

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

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

    被动对焦的思路

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

    主动对焦

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

    private Handler mHandler = new Handler(){
            @Override
            public void handleMessage(Message msg) {
                super.handleMessage(msg);
                switch (msg.what){
                    case 0x01:
                        mCamera.autoFocus(new Camera.AutoFocusCallback() {
                            @Override
                            public void onAutoFocus(boolean success, Camera camera) {
    
    
                            }
                        });
                        mHandler.sendEmptyMessageDelayed(0x01,2*1000);
                        break;
                    default:
                        break;
                }
            }
    mTextureview.setSurfaceTextureListener(new TextureView.SurfaceTextureListener() {
                @Override
                public void onSurfaceTextureAvailable(SurfaceTexture surface, int width, int height) {
                    initCamera();
                    initCameraConfig();
                    try {
                        mCamera.setPreviewTexture(surface);
                        mCamera.startPreview();
                        mHandler.sendEmptyMessage(0x01);
                    } catch (IOException e) {
                        e.printStackTrace();
                    }
    
                }
    
                @Override
                public void onSurfaceTextureSizeChanged(SurfaceTexture surface, int width, int height) {
    
                }
    
                @Override
                public boolean onSurfaceTextureDestroyed(SurfaceTexture surface) {
                    return false;
                }
    
                @Override
                public void onSurfaceTextureUpdated(SurfaceTexture surface) {
    
                }
            });
  • 相关阅读:
    mongodb 介绍
    mysql+mencached 大规模web应用程序首选
    Hadoop 安装部署
    Hadoop 快速入门
    盘点十大热门Linux服务器发行版
    NoSQL数据库探讨之一 - 为什么要用非关系数据库?
    也谈IT企业发展模式
    linux中的分区与格式化(五)
    linux文件系统维护(四)
    Meta标签详解(转)
  • 原文地址:https://www.cnblogs.com/guanxinjing/p/10986249.html
Copyright © 2020-2023  润新知