2016-10-04 13 views
1

私のActivityには、カメラプレビューと少数のコントロールボタンを表示するためのSurfaceViewがあります。このActivityには、向きが横長でカメラのプレビュー比率が4:3に設定されている最初のものと、向きがポートレートでカメラのプレビューがすっきりしている場合の2つの作業ケースがあります。 私が実際にやりたいことは、向きに合わせてビューを調整することです。 マニフェストのアクティビティの説明にandroid:configChanges="orientation|screenSize"を追加することで、自分のアクティビティのオリエンテーションを変更しようとしましたが、ここでの問題はonCreate()メソッドが呼び出されず、アクティビティコンポーネントが再配置されたと考えられます。私はそれがsuper.onConfigurationChanged(null);(私は例外を得るため、私は避けることはできません)を呼び出すときに起こると思います。 達成しようとしている効果を達成することがまったく可能なのではないかと私の質問がありますか?あるいは、私は別の方向に対して2つの別々のレイアウトを持ち、アクティビティを再作成できるようにするしかありませんか? This is how my acitivyt look like in portrait mode And this is what I get when rotate my deviceレイアウトに触れることなくAndroidのアクティビティの向きを変更する

答えて

0

あなたが各方向に別々のレイアウトせずにこれを実行したい場合は、あなただけのアスペクト比を調整する方法でSurfaceView(またはTextureView)をサブクラス化することができます。これは実際にAndroidのチームがCamera sample applicationsで使用する方法である:

public class AutoFitTextureView extends TextureView { 

    private int mRatioWidth = 0; 
    private int mRatioHeight = 0; 

    public AutoFitTextureView(Context context) { 
     this(context, null); 
    } 

    public AutoFitTextureView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public AutoFitTextureView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
    } 

    public void setAspectRatio(int width, int height) { 
     if (width < 0 || height < 0) { 
      throw new IllegalArgumentException("Size cannot be negative."); 
     } 
     mRatioWidth = width; 
     mRatioHeight = height; 
     requestLayout(); 
    } 

    @Override 
    protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) { 
     super.onMeasure(widthMeasureSpec, heightMeasureSpec); 
     int width = MeasureSpec.getSize(widthMeasureSpec); 
     int height = MeasureSpec.getSize(heightMeasureSpec); 
     if (0 == mRatioWidth || 0 == mRatioHeight) { 
      setMeasuredDimension(width, height); 
     } else { 
      if (width < height * mRatioWidth/mRatioHeight) { 
       setMeasuredDimension(width, width * mRatioHeight/mRatioWidth); 
      } else { 
       setMeasuredDimension(height * mRatioWidth/mRatioHeight, height); 
      } 
     } 
    } 

} 

その後、あなたはあなたがする必要があるすべてはいつかonResume後にデバイスの向きを確認され、onConfigurationChangedを上書きする必要はありません。

int orientation = getResources().getConfiguration().orientation; 
if(orientation == Configuration.ORIENTATION_LANDSCAPE) { 
    mAutoFitTextureView.setAspectRatio(width, height); 
} else { 
    mAutoFitTextureView.setAspectRatio(width, width); 
} 
+0

ブライアン、ありがとうございます。しかし、このアプローチでは、アクティビティを一時停止してから再開する必要があります。たぶんそれは私のメッセージからは分かりませんが、私は自分のアクティビティが実行されているときにオリエンテーションの変更を処理し、効果を達成しようとする必要があります。 Android SDKにこれ用のツールがあるかどうかはわかりません)。 – Yurii

関連する問題