2012-07-04 4 views
23

getSupportedPreviewSizes()の歪みのないプレビューサイズに関係なく、カメラのプレビューをフルスクリーンする必要があるAndroidアプリケーションがあります。私はこのプレビューを高さと幅のどちらかでプレビューすることを期待していますが、これは私には関係ありません。私がこれをやりたいのは、ある種のアンドロイドカメラ(例えば、Samsung Galaxy SIIの正面カメラ)は、ディスプレイと同じアスペクト比のプレビューを返さないため、伸ばしてクリップする必要があるからです。ディスプレイよりも大きなSurfaceViewにカメラプレビューを設定する

カメラプレビューを表示サイズより大きなビューに完全に拡大することはできますか?サーフェスビューのレイアウトパラメータをmatch_parentに設定するだけで返されるプレビューピクセルサイズよりもSurfaceViewを大きくすることは可能ですが、結果的に歪みが生じ、プレビューが表示を満たすまで可能です。これは、ディスプレイのプレビューが不可能であり、ハードウェア(またはOS)がそのような動作を制限していることを示しているようです。

トピックにはanother questionがありますが、その質問は、画面のサイズより大きなSurfaceViewを作成することはできないと主張しています。これは、ロギングで見つかったように、偽です。しかし、カメラのプレビューは巨大なSurfaceViewのフルサイズには成長できません。

私の試み:

私は相対的なレイアウト、その中でframeLayoutを持っており、その中に私がSurfaceViewを作成します。相対レイアウト全体の幅は、デバイスの画面サイズの2倍の635dp以下に設定されています。でframeLayoutこのサイズに一致するので、SurfaceView(後でプログラムで追加)

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:id="@+id/camera_activity_layout" 
    android:layout_width="635dp" 
    android:layout_height="match_parent" > 

    <FrameLayout 
     android:id="@+id/camera_preview" 
     android:layout_width="match_parent" 
     android:layout_height="match_parent"> 
    </FrameLayout> 

</RelativeLayout> 

が行う以下取得し、プレビューサイズを設定するコードです。ここでは、FrameLayout全体(画面の幅の2倍)を満たすようにカメラのプレビューを拡大したいと考えています。ビューは完全に正常に表示され、完全に破壊されるので、この特定の質問に関連しないコードは、本質的な質問から逸脱し、表示サイズをいくつかの大きさに簡単かつ単純に拡大しようとしています。

public class CameraPreview extends SurfaceView implements SurfaceHolder.Callback { 

    ... 

    public void surfaceChanged(SurfaceHolder holder, int format, int w, int h) { 
     Camera.Parameters parameters = mCamera.getParameters(); 
     final DisplayMetrics dm = this.getResources().getDisplayMetrics(); 
      //getBestPreviewSize returns the best preview size, don't worry 
      //but some devices do not return one for all camera matching the aspect ratio 
     cameraSize = getBestPreviewSize(parameters, dm.heightPixels, dm.widthPixels); 

     if (cameraSize!=null) { 
      parameters.setPreviewSize(cameraSize.width, cameraSize.height); 
      mCamera.setParameters(parameters); 
     } 

     FrameLayout.LayoutParams frameParams = (FrameLayout.LayoutParams) this.getLayoutParams(); 

     frameParams.width = 800; //For argument's sake making this ~double the width of the display. Same result occurs if I use MATCH_PARENT 
     frameParams.height = LayoutParams.MATCH_PARENT; 
     this.setLayoutParams(frameParams); 

     try { 
      mCamera.setPreviewDisplay(mHolder); 
      mCamera.startPreview(); 

      Log.d("surfChange","W/H of CamPreview (child) is "+this.getWidth()+"/"+this.getHeight()+" while parent is "); 
      Log.d("surfChange","W/H of holder (child) is "+mHolder.getSurfaceFrame().width()+"/"+mHolder.getSurfaceFrame().height()+" while parent is "); 
     } catch (Exception e){ 
     } 
    } 
}; 

私はこの努力で成功する唯一の方法は、何らかの形でOpenGLの表面にレンダリングすることですが、これapparentlyがフルカラーで遅すぎるかもしれないと心配です。カメラのプレビューを単純に伸ばしてクリップすることもできます。

解決策をお試しいただきありがとうございます。

+0

urc oncreate()コードを投稿できますか?またはあなたがsetcontentview()メソッドを呼び出すところ –

+0

なぜあなたはそのコードについて興味がありますか?これはかなり基本的なもので、上で共有したxmlにコンテンツビューを設定するだけです。 –

+0

OK私はウィンドウマネージャを越えてビューを拡大することはできません、私はまた、ビデオのセクションでズームを探していますが、すべてのサーフェイスビューとカスタムビデオビューを使用して私はdntを得る、ビデオはサイズを超えて切り取られていません –

答えて

12

これは非常に遅い回答ですが、可能です。以下は、Android SDKサンプルのコードです。これは、AndroidのSDKサンプルをダウンロードし、このコードは、最小寸法にプレビューにフィットするように意図されてSamples/android-10(one I used, could try whichever you want to target)/ApiDemos/src/com/example/android/apis/graphics/CameraPreview.java

class PreviewSurface extends ViewGroup implements SurfaceHolder.Callback { 
... 
@Override 
protected void onLayout(boolean changed, int l, int t, int r, int b) { 
    if (changed && getChildCount() > 0) { 
     final View child = getChildAt(0); 

     final int width = r - l; 
     final int height = b - t; 

     int previewWidth = width; 
     int previewHeight = height; 
     if (mPreviewSize != null) { 
      previewWidth = mPreviewSize.width; 
      previewHeight = mPreviewSize.height; 
     } 

     // Center the child SurfaceView within the parent. 
     if (width * previewHeight > height * previewWidth) { 
      final int scaledChildWidth = previewWidth * height/previewHeight; 
      child.layout((width - scaledChildWidth)/2, 0, 
        (width + scaledChildWidth)/2, height); 
     } else { 
      final int scaledChildHeight = previewHeight * width/previewWidth; 
      child.layout(0, (height - scaledChildHeight)/2, 
        width, (height + scaledChildHeight)/2); 
     } 
    } 
} 
} 

に行く実装するためのコードの残りの部分を表示するには(それが台無しaspcect比をしない)と、もう一方の次元に黒いバーがあります。しかし、><に置き換えて、あなたが望むものを達成することができます。例:

if (width * previewHeight < height * previewWidth) {... 
関連する問題