2011-09-28 37 views
22

我正在编写的应用程序需要相机功能。 所以要了解如何操作相机,我跟着这个脚本:安卓相机在横向模式下延伸

http://developer.android.com/resources/samples/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.html

我已经把活动在我的清单中,将屏幕方向为它在横向模式。

我遇到的问题是,当相机横向举行时(所以我将Galaxy Tab P1000保持在横向位置),视图被拉伸。

为了更具体地了解我的脚本,我使用了Google制作的代码的精确副本。它可以在android-sdk \ samples \ android-8 \ ApiDemos \ src \ com \ example \ android \ apis \ graphics \

中找到。该文件本身称为CameraPreview。

我真的不知道为什么屏幕看起来如此紧张。当然,这种格式很奇怪而不是方块,但是,当使用安装在设备上的默认相机应用程序时,它完全不会变形。当我侧向握住相机并将相机移动一点时,该相机会使图像变形。

enter image description here

enter image description here

我所做的是:我握着我的Galaxy Tab采取的对象(笔记本在这种情况下)的图片,然后拍了一张照片与我的我的银河手机。在Galaxy上,我在我正在制作的应用中打开相机屏幕。这对两个图像都很重要。一个我侧身举行,另一个我纵向观看。照片有点不清楚,但你可以看到,在风景照片中,相机变得非常宽广。

+3

T_T那么我是世界上唯一有这个问题的人吗? <: –

+0

我也遇到过这个问题... – Saty

+0

这个问题是一个隐藏的宝石!我很难找到这个。在谷歌中使用了所有关键字。这个问题挽救了我的生命。 –

回答

21

昨天我遇到了同样的问题。在研究“相机”资源后,我发现相机预览被拉伸的原因。

原因是:SurfaceView纵横比(宽度/高度)必须与预览参数中使用的Camera.Size纵横比相同。如果宽高比不一样,你就得到了延伸的图像。

因此,最快的解决方法是将SurfaceView设置为像320px x 240px - 从Parameters.getSupportedPreviewSizes()中支持的最小尺寸。此外,您可以查看Camera标准应用程序源,它使用自定义布局来控制SurfaceView大小(请参阅PreviewFrameLayout.java,onMeasure()函数)。

使用

混帐克隆https://android.googlesource.com/platform/packages/apps/Camera.git

让摄像机源。

+1

+1用于描述实际问题。您可以在surfaceChanged中找到SurfaceView的高度和宽度,然后在Camera参数对象上使用getSupportedPreviewSizes来查找最接近的匹配项,并将SurfaceView设置为所需的可接受大小。 –

+0

我是这样做的,但不起作用。私有Camera.Size getBestPreviewSize(int宽度,int高度,Camera.Parameters参数){0} {0} {0} {0} Camera.Size result = null; \t为(Camera.Size尺寸:parameters.getSupportedPreviewSizes()){ \t \t如果(size.width <=宽度&& size.height <=高度){ \t \t \t如果(结果== NULL){ \t \t \t \t result = size; \t \t \t} \t \t \t否则{ \t \t \t \t INT resultArea = result.width * result.height; \t \t \t \t int newArea = size.width * size.height; \t \t \t \t如果(newArea> resultArea){ \t \t \t \t \t结果=大小; \t \t \t \t} \t \t \t} \t \t} \t}回报(结果); } – gIrL

+1

您的代码只是寻找最适合初始宽度和高度的最大预览大小。当然,你在屏幕拉伸方面遇到问题,因为最大的并不意味着“最佳纵横比”。您需要通过调整其宽度或高度来将预览视图大小调整为该“最大”大小,对于初始值(宽度,高度)和最终值(result.width,width),ratio = width/height将相同。 result.height) – Lord

7
public void surfaceCreated(SurfaceHolder holder) { 
     // TODO Auto-generated method stub 

     try { 
      camera = Camera.open(); 

      camera.setDisplayOrientation(90); 
      camera.setPreviewDisplay(holder); 
      Camera.Parameters parameters = camera.getParameters(); 
      List<Size> sizes = parameters.getSupportedPictureSizes(); 
      parameters.setPictureSize(sizes.get(0).width, sizes.get(0).height); // mac dinh solution 0 
      parameters.set("orientation","portrait"); 
      //parameters.setPreviewSize(viewWidth, viewHeight); 
      List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 
      camera.startPreview(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

你只需要getSupportedPreviewSizes()并将其保存到一个List

List<Size> size = parameters.getSupportedPreviewSizes(); 
      parameters.setPreviewSize(size.get(0).width, size.get(0).height); 
      camera.setParameters(parameters); 



camera.startPreview(); 

我希望这可以帮助你。