在SurfaceView-Preview中缩放相机

时间:2012-02-14 14:30:58

标签: android camera zoom surfaceview

我知道相机功能getMaxZoom()isZoomSupported()get/setZoom()。我可以使用这些功能,但我的Surface-Camera-Preview没有任何反应。我希望我的预览始终以缩放开始。我使用的是Android 2.3.3。我忘记了什么吗?!

代码是:

Camera.Parameters parameters = camera.getParameters();
if(parameters.isZoomSupported())
          {
              int maxZoom= parameters.getMaxZoom();
              parameters.setZoom(maxZoom);
              camera.setParameters(parameters);
          }

希望有人有个主意......

谢谢!

3 个答案:

答案 0 :(得分:6)

import android.content.Context;
import android.graphics.PixelFormat;
import android.hardware.Camera;
import android.hardware.Camera.Parameters;
import android.view.SurfaceHolder;
import android.view.SurfaceView;

public class CustomCameraView extends SurfaceView
{
    Camera camera;
    SurfaceHolder previewHolder;

    public void zoom()
    {
        Parameters params=camera.getParameters();
        params.setZoom(params.getMaxZoom());
        camera.setParameters(params);   
    }

    public void unzoom()
    {
        Parameters params=camera.getParameters();
        params.setZoom(0);
        camera.setParameters(params);
    }

    public CustomCameraView(Context context) 
    {
        super(context);
        previewHolder=this.getHolder();
        previewHolder.setType(SurfaceHolder.SURFACE_TYPE_PUSH_BUFFERS);

        SurfaceHolder.Callback surfaceHolderListener=new SurfaceHolder.Callback()
        {
            public void surfaceCreated(SurfaceHolder holder) 
            {
                camera=Camera.open();
                try{
                    camera.setPreviewDisplay(previewHolder);
                }
                catch (Exception e) {
                }
            }

            public void surfaceChanged(SurfaceHolder holder, int format,
                    int width, int height) {
                Parameters params=camera.getParameters();
                params.setPreviewSize(width, height);
                params.setPictureFormat(PixelFormat.JPEG);

                //if you want the preview to be zoomed from start :
                params.setZoom(params.getMaxZoom());

                camera.setParameters(params);
                camera.startPreview();
            }

            public void surfaceDestroyed(SurfaceHolder holder) {
                camera.stopPreview();
                camera.release();
            }
        };
        previewHolder.addCallback(surfaceHolderListener);
    }

}

答案 1 :(得分:4)

if (params.isZoomSupported()) {
    final int maxZoomLevel = params.getMaxZoom();
    Log.i("max ZOOM ", "is " + maxZoomLevel);
    zoomControls.setIsZoomInEnabled(true);
    zoomControls.setIsZoomOutEnabled(true);

    zoomControls.setOnZoomInClickListener(new OnClickListener(){
        public void onClick(View v){
            if(currentZoomLevel < maxZoomLevel){
                currentZoomLevel++;
                //mCamera.startSmoothZoom(currentZoomLevel);
                params.setZoom(currentZoomLevel);
                mCamera.setParameters(params);
            }
        }
    });

    zoomControls.setOnZoomOutClickListener(new OnClickListener(){
        public void onClick(View v){
            if(currentZoomLevel > 0){
                currentZoomLevel--;
                params.setZoom(currentZoomLevel);
                mCamera.setParameters(params);
            }
        }
    });    
}
else
    zoomControls.setVisibility(View.GONE);

答案 2 :(得分:2)

你用的是哪款手机?我正在开发一个使用相机的应用程序,我测试的所有设备的行为都不同。如果你愿意,我可以发布一个测试应用程序。 http://www.mediafire.com/?laxtolevt57vax2

这是我一直在使用的测试应用程序的链接。我做了很多改动,以便在多部手机上工作。它仍然远非完美,但缩放工作。我已经测试过了 三星Galaxy s2, Droid X, Droid Bionic, 机器人2, LG Ally。它不适用于HTC Sensation。 getMaxZoom()返回零。它也不适用于HTC Incredible 2.从不执行AutoFocusCallback并且应用程序挂起,并锁定相机。