2

我试图在我的相机记录应用程序中处理“s4 zoom”设备上的 ZoomIn/ZoomOut。因为它只支持常规缩放,即parameters.isZoomSupported()==true, parameters.isSmoothZoomSupported()==false,所以我parameters.setZoom(mZoomVal); mCamera.setParameters(parameters);照常使用。问题是缩放是生涩的、嘈杂的并且不平滑。有人知道如何像在三星相机应用程序中那样处理“s4 变焦”中的变焦速度吗?

public boolean onKeyDown(int keyCode, KeyEvent event) {
    Log.v("onKeyDown keyCode="+keyCode+" event="+event.toString());

    boolean handled = false;
    switch(keyCode){
    case KeyEvent.KEYCODE_FOCUS:
        setAutoFocus();
        handled = true;
        break;
    case KeyEvent.KEYCODE_CAMERA:

        if(event.getRepeatCount() == 0){
            if (isRec()) {
                stopRec(1, 0);
            } else {
                startRec();
            }
        }

        handled = true;
        break;
    case 256: //KeyEvent.KEYCODE_CAMERA_ZOOM_RING_MOVE:
        handled = true;
        break;
    case 261: //KeyEvent.KEYCODE_CAMERA_ZOOM_RING_SPEED2
        handled = true;
        break;
    case KeyEvent.KEYCODE_ZOOM_IN:
        setZoomIn();
        //AutoFocus();
        handled = true;
        break;
    case KeyEvent.KEYCODE_ZOOM_OUT:
        setZoomOut();
        //AutoFocus();
        handled = true;
        break;
    }

    if(handled)
        Log.v("onKeyDown HANDLED!");
    else
        return super.onKeyDown(keyCode, event);

    return handled;
}
public int setZoomIn(){
    if(mCamera == null){
        return 0;
    }

    Parameters parameters = mCamera.getParameters();
    List<Integer> zoom_list = parameters.getZoomRatios();
    if(mZoomVal >= mZoomMax)
        return zoom_list.get(mZoomMax);

    /*
    if(isAutoFocusing){
        mCamera.cancelAutoFocus();
        isAutoFocusing = false;
    }*/


    mZoomVal++;
    isFocused = false;

    parameters.setZoom(mZoomVal);
    mCamera.setParameters(parameters);

    mZoomVal = parameters.getZoom();

    return zoom_list.get(mZoomVal);
}

public int setZoomOut(){
    if(mCamera == null){
        return 0;
    }

    Parameters parameters = mCamera.getParameters();
    List<Integer> zoom_list = parameters.getZoomRatios();
    if(mZoomVal <= 0)
        return zoom_list.get(0);

    /*
    if(isAutoFocusing){
        mCamera.cancelAutoFocus();
        isAutoFocusing = false;
    }*/


    mZoomVal--;
    isFocused = false;

    parameters.setZoom(mZoomVal);
    mCamera.setParameters(parameters);

    mZoomVal = parameters.getZoom();

    return zoom_list.get(mZoomVal);
}

public void setAutoFocus(){
    if(mCamera == null){
        return;
    }

    if(isFocused)
        return;

    if(isAutoFocusing){
        mCamera.cancelAutoFocus();
        isAutoFocusing = false;
    }

    isAutoFocusing = true;
    mCamera.autoFocus(new Camera.AutoFocusCallback() {

        @Override
        public void onAutoFocus(boolean success, Camera camera) {
            Log.v("onAutoFocus success="+success);
            isAutoFocusing = false;
            isFocused = success;
        }
    });

}
4

2 回答 2

4

我已经找到了在三星 S4 变焦设备上平滑控制快门镜头的解决方案。将设备设置为智能模式parameters.set("mode", "smart-auto");

对于放大开始parameters.set("zoom-action", "optical-tele-start");

对于缩小开始parameters.set("zoom-action", "optical-wide-start");

对于缩放动作停止parameters.set("zoom-action", "zoom-stop");

快门速度parameters.set("zoom-speed", 1); //1,2,...

不要忘记在 Camera 实例中保存参数mCamera.setParameters(parameters);

这在我的设备中运行良好,快门现在安静且平滑。:) 问候。

于 2013-09-19T04:40:51.430 回答
2

此外,为了获取当前缩放值,请使用以下代码:

            Parameters parameters = mCamera.getParameters();
            List<Integer> zoom_list = parameters.getZoomRatios();

            int val = 0;

            if(isSamsungS4Zoom){
                    //FOR S4 ZOOM
                    mZoomVal = parameters.getInt("curr_zoom_level");
                    val = zoom_list.get(mZoomVal);
            }else{
                    val = zoom_list.get(mZoomVal);
            }
于 2013-10-29T13:13:03.310 回答