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

我是天王蓋地虎的分割線   


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM