博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Android -- 触摸Area对焦区域(更新)
阅读量:6507 次
发布时间:2019-06-24

本文共 2862 字,大约阅读时间需要 9 分钟。

老早就想找关于不同点击不同地方的对焦,但是一直没有找到,现在项目又需要这个功能,又跑出来找找,最后还是找到啦~~关于对焦更多的是关于自动对焦。

废话不多说,直接来干货,主要是setFocusAreas方式实现的。

每个对角区域是一个具有特定权值的长方形。方向与重力感应的方向有关。这个方向不会受到 setDisplayOrientation(int)设置的影响。矩形的坐标范围从-1000到1000 ,(-1000,-1000)是左上角点(1000,1000)是右下角点。对焦区域的长或宽不能为0或负数,而权值的取值范围是1-1000,权值为矩形范围像素所平分,这意味着同样的权值对焦区域大的对整体的对焦影响小。

Code         

private Rect calculateTapArea(float x, float y, float coefficient) {        float focusAreaSize = 200;        int areaSize = Float.valueOf(focusAreaSize * coefficient).intValue();        Log.i("calculateTapArea", "areaSize--->" + areaSize);//300        Log.i("calculateTapArea", "x--->" + x + ",,,y--->" + y);//对的        int centerX = (int) ((x / getResolution().width) * 2000 - 1000);        int centerY = (int) ((y / getResolution().height) * 2000 - 1000);        Log.i("calculateTapArea", "getResolution().width--->" + getResolution().width + ",,,,getResolution().height--->" + getResolution().height);        int left = clamp(centerX - (areaSize / 2), -1000, 1000);        int top = clamp(centerY - (areaSize / 2), -1000, 1000);        RectF rectF = new RectF(left, top, left + areaSize, top + areaSize);        Log.i("calculateTapArea", "left--->" + left + ",,,top--->" + top + ",,,right--->" + (left + areaSize) + ",,,bottom--->" + (top + areaSize));        Log.i("calculateTapArea", "centerX--->" + centerX + ",,,centerY--->" + centerY);        return new Rect(Math.round(rectF.left), Math.round(rectF.top),                Math.round(rectF.right), Math.round(rectF.bottom));    }
private int clamp(int x, int min, int max) {        if (x > max) {            return max;        }        if (x < min) {            return min;        }        return x;    }    public Camera.Size getResolution() {        Camera.Parameters params = myCamera.getParameters();        Camera.Size s = params.getPreviewSize();        return s;    }

在OnTouch事件里面调用此方法。

public void focusOnTouch(MotionEvent event) {        Rect focusRect = calculateTapArea(event.getRawX(), event.getRawY(), 1f);        Rect meteringRect = calculateTapArea(event.getRawX(), event.getRawY(), 1.5f);        Camera.Parameters parameters = mCamera.getParameters();        parameters.setFocusMode(Camera.Parameters.FOCUS_MODE_AUTO);        if (parameters.getMaxNumFocusAreas() > 0) {            List
focusAreas = new ArrayList
(); focusAreas.add(new Camera.Area(focusRect, 600)); parameters.setFocusAreas(focusAreas); } if (parameters.getMaxNumMeteringAreas() > 0) { List
meteringAreas = new ArrayList
(); meteringAreas.add(new Camera.Area(meteringRect, 600)); parameters.setMeteringAreas(meteringAreas); } mCamera.cancelAutoFocus(); mCamera.setParameters(parameters); mCamera.autoFocus(this); }

我是天王盖地虎的分割线   

转载地址:http://ebwfo.baihongyu.com/

你可能感兴趣的文章
安德鲁斯----多媒体编程
查看>>
[zz]在linux中出现there are stopped jobs 的解决方法
查看>>
Delphi下实现全屏快速找图找色 一、数据提取
查看>>
查询表字段信息
查看>>
logback与Log4J的区别
查看>>
关于机器学习的最佳科普文章:《从机器学习谈起》
查看>>
dxFlowChart运行时调出编辑器
查看>>
NET Framework 3.0 (WinFX) RTM发布
查看>>
图片拼接器
查看>>
C++ TinyXml操作(含源码下载)
查看>>
读取swf里所有类定义
查看>>
DOWNLOAD 文件
查看>>
ogre场景图与场景内容分离
查看>>
中断小笔记
查看>>
C#委托、事件、消息(入门级)
查看>>
通信常用概念
查看>>
FreeBinary 格式说明
查看>>
使用Spring Cloud和Docker构建微服务
查看>>
常用链接
查看>>
NB-IoT的成功商用不是一蹴而就
查看>>