蕭懷德 發表於 2019-6-6 17:49:00

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

<h1><span style="color: rgba(0, 128, 128, 1)">前言 </span></h1>
<p>  Camera1的自动对焦还是有一些坑值得开一个篇幅来讲解,一般对焦Mode有以下几种:</p>
<ul>
<li><span style="color: rgba(0, 0, 0, 1)">  Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO 连续自动对焦视频</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">  Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE&nbsp; 连续自动对焦图像</span></li>
<li><span style="color: rgba(0, 0, 0, 1)">  Camera.Parameters.FOCUS_MODE_AUTO 自动对焦(单次)</span></li>
</ul>
<h1><span style="color: rgba(0, 128, 128, 1)">检查支持的对焦Mode</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">有些时候前摄像头不支持一些对焦模式,所以我们在切换摄像头后配置摄像就需要检查一遍支持的对焦模式</span></p>
<div class="cnblogs_code">
<pre>List&lt;String&gt; focusModeList =<span style="color: rgba(0, 0, 0, 1)"> parameters.getSupportedFocusModes();</span>
<span style="color: rgba(0, 0, 255, 1)">for</span> (String focusMode : focusModeList){<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">检查支持的对焦</span>
      <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO)){
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_VIDEO);
            }</span><span style="color: rgba(0, 0, 255, 1)">else</span> <span style="color: rgba(0, 0, 255, 1)">if</span><span style="color: rgba(0, 0, 0, 1)"> (focusMode.contains(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE)){
                parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_CONTINUOUS_PICTURE);
            }
      }</span></pre>
</div>
<h1><span style="color: rgba(0, 128, 128, 1)">FLASH_MODE_AUTO设置自动对焦Mode</span></h1>
<p><span style="color: rgba(0, 0, 0, 1)">其他对焦模式并没有上面好说的使用后会一直自动对焦,但是FLASH_MODE_AUTO对焦比较独特,它其实调用一次才触发一次的对焦.</span></p>
<div class="cnblogs_code">
<pre>Camera.Parameters parameters =<span style="color: rgba(0, 0, 0, 1)"> mCamera.getParameters();
parameters.setFocusMode(Camera.Parameters.FLASH_MODE_AUTO); </span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">对焦设置为自动
</span><span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">其他参数配置略...</span>
mCamera.setParameters(parameters);<span style="color: rgba(0, 128, 0, 1)">//</span><span style="color: rgba(0, 128, 0, 1)">添加参数</span></pre>
</div>
<p>很简单在配置Camera1的时候调用<span style="color: rgba(0, 0, 0, 1)">setFocusMode(Camera.Parameters.FLASH_MODE_AUTO)</span> 实现自动对焦</p>
<h3><span style="color: rgba(0, 128, 128, 1)">启用自动对焦</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)">在上面将对焦设置为自动模式后,并不是真的就自动对焦(自动对焦的意思其实是当前屏幕中心的画面自动对焦),所以我们需要触发一次对焦.</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 0, 1)">mCamera.setPreviewTexture(surface);
mCamera.startPreview();
mCamera.autoFocus(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Camera.AutoFocusCallback() {
      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onAutoFocus(<span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> success, Camera camera) {

      }
    });      </span></pre>
</div>
<p><strong>注意!对焦是需要在预览开始之后才能调用的,否则报错.</strong>以上设置一次<span style="color: rgba(0, 0, 0, 1)">autoFocus</span> 就等于对焦一次.<strong>注意!是只对焦一次! 它不是一直在对焦!</strong></p>
<h3><span style="color: rgba(0, 128, 128, 1)">FLASH_MODE_AUTO实现主动对焦和被动对焦的思路</span></h3>
<h3><span style="color: rgba(0, 128, 128, 1)">被动对焦的思路</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)">被动对焦的思路很简单,用一个Button或者点击预览View进行一次对焦,所以,正常开发的情况下,需要使用一个布尔值来判断当前是不是在预览状态.</span></p>
<h3><span style="color: rgba(0, 128, 128, 1)">主动对焦</span></h3>
<p><span style="color: rgba(0, 0, 0, 1)">也很简单写一个Handler循环就行了,我下面的例子就是每隔2秒对焦一次</span></p>
<div class="cnblogs_code">
<pre><span style="color: rgba(0, 0, 255, 1)">private</span> Handler mHandler = <span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Handler(){
      @Override
      </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> handleMessage(Message msg) {
            </span><span style="color: rgba(0, 0, 255, 1)">super</span><span style="color: rgba(0, 0, 0, 1)">.handleMessage(msg);
            </span><span style="color: rgba(0, 0, 255, 1)">switch</span><span style="color: rgba(0, 0, 0, 1)"> (msg.what){
                </span><span style="color: rgba(0, 0, 255, 1)">case</span> 0x01<span style="color: rgba(0, 0, 0, 1)">:
                  mCamera.autoFocus(</span><span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> Camera.AutoFocusCallback() {
                        @Override
                        </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onAutoFocus(<span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> success, Camera camera) {


                        }
                  });
                  mHandler.sendEmptyMessageDelayed(</span>0x01,2*1000<span style="color: rgba(0, 0, 0, 1)">);
                  </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
                </span><span style="color: rgba(0, 0, 255, 1)">default</span><span style="color: rgba(0, 0, 0, 1)">:
                  </span><span style="color: rgba(0, 0, 255, 1)">break</span><span style="color: rgba(0, 0, 0, 1)">;
            }
      }</span></pre>
</div>
<div class="cnblogs_code">
<pre>mTextureview.setSurfaceTextureListener(<span style="color: rgba(0, 0, 255, 1)">new</span><span style="color: rgba(0, 0, 0, 1)"> TextureView.SurfaceTextureListener() {
            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onSurfaceTextureAvailable(SurfaceTexture surface, <span style="color: rgba(0, 0, 255, 1)">int</span> width, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> height) {
                initCamera();
                initCameraConfig();
                </span><span style="color: rgba(0, 0, 255, 1)">try</span><span style="color: rgba(0, 0, 0, 1)"> {
                  mCamera.setPreviewTexture(surface);
                  mCamera.startPreview();
                  mHandler.sendEmptyMessage(</span>0x01<span style="color: rgba(0, 0, 0, 1)">);
                } </span><span style="color: rgba(0, 0, 255, 1)">catch</span><span style="color: rgba(0, 0, 0, 1)"> (IOException e) {
                  e.printStackTrace();
                }

            }

            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span> onSurfaceTextureSizeChanged(SurfaceTexture surface, <span style="color: rgba(0, 0, 255, 1)">int</span> width, <span style="color: rgba(0, 0, 255, 1)">int</span><span style="color: rgba(0, 0, 0, 1)"> height) {

            }

            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">boolean</span><span style="color: rgba(0, 0, 0, 1)"> onSurfaceTextureDestroyed(SurfaceTexture surface) {
                </span><span style="color: rgba(0, 0, 255, 1)">return</span> <span style="color: rgba(0, 0, 255, 1)">false</span><span style="color: rgba(0, 0, 0, 1)">;
            }

            @Override
            </span><span style="color: rgba(0, 0, 255, 1)">public</span> <span style="color: rgba(0, 0, 255, 1)">void</span><span style="color: rgba(0, 0, 0, 1)"> onSurfaceTextureUpdated(SurfaceTexture surface) {

            }
      });</span></pre>
</div>
<p>&nbsp;</p>

</div>
<div id="MySignature" role="contentinfo">
    <div style="text-align: center">
    <p style="color:orange;font-size:16px;" >本文来自博客园,作者:观心静 ,转载请注明原文链接:https://www.cnblogs.com/guanxinjing/p/10986249.html </p>
    <div style="color:orange;font-size:16px;">本文版权归作者和博客园共有,欢迎转载,但必须给出原文链接,并保留此段声明,否则保留追究法律责任的权利。 </div>
</div><br><br>
来源:https://www.cnblogs.com/guanxinjing/p/10986249.html
頁: [1]
查看完整版本: Android 开发 Camera1_如何使用对焦功能