前言

  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) { }
});

最新文章

  1. python版本随意切换之python2.7+django1.8.7+uwsgi+nginx源码包部署。
  2. HDU 2296 Ring -----------AC自动机,其实我想说的是怎么快速打印字典序最小的路径
  3. selenium元素操作
  4. oracle 执行 delete user$ 误删所有用户信息后的数据恢复流程
  5. Android消息机制
  6. 【POJ】1811 Prime Test
  7. MongoDB 用户配置
  8. 嵌入式之Linux系统裁剪和定制---(kernel+busyboxy+dropbear+nginx)
  9. C#设计模式(9)——装饰者模式(Decorator Pattern)
  10. PowerDesigner 16.5对SQL Server 2012 生成数据库时&quot;不支持扩展属性&quot;问题
  11. Android 之 JSON操作
  12. Careercup - Microsoft面试题 - 5428361417457664
  13. 【Android】不弹root请求框检测手机是否root
  14. Unity3D 相关项目代码
  15. A Tour of Go Slicing slices
  16. Ubuntu Apache 伪静态配置 url重写 步骤
  17. 安全的PHP代码编写准则
  18. 2014 I/O返回:Google连接一切
  19. 回答: 2017-03-19的关于css+div布局的疑问 2017-04-05
  20. git 工作总计

热门文章

  1. [JZOJ 5818] 做运动
  2. Photon Server的服务器端配置
  3. Funcation:Object
  4. 使用bash关联数组统计单词
  5. &lt;读书笔记&gt;如何入门爬虫?
  6. startup_stm32f10x_xx.s 启动代码文件选择
  7. flutter 底部bottomNavigationBar凸起效果
  8. 理解Spring框架中Bean的5个作用域
  9. amaze UI(mark)
  10. Qt Creator配置