zoukankan      html  css  js  c++  java
  • Android -- 触摸Area对焦区域(更新)

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

    废话不多说,直接来干货,主要是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<Camera.Area> focusAreas = new ArrayList<Camera.Area>();
                focusAreas.add(new Camera.Area(focusRect, 600));
                parameters.setFocusAreas(focusAreas);
            }
            if (parameters.getMaxNumMeteringAreas() > 0) {
                List<Camera.Area> meteringAreas = new ArrayList<Camera.Area>();
                meteringAreas.add(new Camera.Area(meteringRect, 600));
                parameters.setMeteringAreas(meteringAreas);
            }
            mCamera.cancelAutoFocus();
            mCamera.setParameters(parameters);
            mCamera.autoFocus(this);
        }

    我是天王盖地虎的分割线   

  • 相关阅读:
    20210131
    20210130
    20210129
    20210128
    20210127
    例3-7
    例3-5
    例3-4
    例3-3
    例3-2
  • 原文地址:https://www.cnblogs.com/yydcdut/p/4106966.html
Copyright © 2011-2022 走看看