在SurfaceView预览中缩放摄像头

6
我知道相机的函数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个回答

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

}

尽管parameters.isZoomSupported()返回false,但缩放仍然起作用。 - Aditya Pawade

5
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
你使用的是什么手机?我正在开发一个应用程序,需要使用相机,而我测试过的所有设备都表现不同。如果你想要,我可以发布一个测试应用程序http://www.mediafire.com/?laxtolevt57vax2
这是一个我一直在使用的测试应用程序链接。我进行了许多更改以使其在多个手机上运行。它仍然远离完美,但缩放功能可用。我已经在以下手机上测试过:
三星Galaxy s2, Droid X, Droid Bionic, Droid 2, LG Ally。
它不能在HTC Sensation上工作。getMaxZoom()返回零。它也不能在HTC Incredible 2上工作。AutoFocusCallback从未被执行,应用程序会挂起并锁定相机。

2
因为答案应该提供无需跟随链接即可解决的解决方案,所以被踩了。顺便说一句,链接现在已经失效了。 - Ivar

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接