2011-09-28 33 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(); 

我希望這可以幫助你。