私のActivity
には、カメラプレビューと少数のコントロールボタンを表示するためのSurfaceView
があります。このActivity
には、向きが横長でカメラのプレビュー比率が4:3に設定されている最初のものと、向きがポートレートでカメラのプレビューがすっきりしている場合の2つの作業ケースがあります。 私が実際にやりたいことは、向きに合わせてビューを調整することです。 マニフェストのアクティビティの説明にandroid:configChanges="orientation|screenSize"
を追加することで、自分のアクティビティのオリエンテーションを変更しようとしましたが、ここでの問題はonCreate()
メソッドが呼び出されず、アクティビティコンポーネントが再配置されたと考えられます。私はそれがsuper.onConfigurationChanged(null);
(私は例外を得るため、私は避けることはできません)を呼び出すときに起こると思います。 達成しようとしている効果を達成することがまったく可能なのではないかと私の質問がありますか?あるいは、私は別の方向に対して2つの別々のレイアウトを持ち、アクティビティを再作成できるようにするしかありませんか? レイアウトに触れることなくAndroidのアクティビティの向きを変更する
1
A
答えて
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);
}
関連する問題
- 1. androidのアクティビティに触れることなくフラグメントからフラグメントへデータを渡すことは可能ですか
- 2. Androidスタジオのコミットダイアログに、マウスに触れることなく変更を表示するホットキーがありますか?
- 3. Androidのスクロール可能なレイアウトの向きの変更
- 4. ファイルに触れることなくCDNホストJSファイルの設定を変更
- 5. Android:向きを変更するときにリストビューの項目レイアウトを変更しますか?
- 6. 垂直方向のシークバーをプログラムで更新できません(手を触れることなく)
- 7. Androidレイアウトの向き
- 8. ectoのupdated_atに触れることなくモデルを更新するには?
- 9. 向きが横向きに変更されたときにAndroidのロケールが変更される
- 10. Unityに触れたときのオブジェクトの色を変更する
- 11. DOMに触れることなくアプリの状態を更新する - Vue.js
- 12. Androidのアクティビティの向きが自動的に変更されます
- 13. アクティビティのレイアウトを変更
- 14. 変数Cに触れることなくcout値
- 15. Androidのアクティビティ向きが変わったときに再起動する
- 16. チタンの向き変更のレイアウトを再編成する
- 17. Android向きの変更
- 18. ARKit - 画面に触れることなくオブジェクトを置く
- 19. 向きと画面サイズの異なるレイアウト - Android
- 20. Android:デフォルトのアクティビティを変更するときのバグ
- 21. Androidのレイアウト変更を聞きます
- 22. SKNodeに触れることなくドラッグアンドドロップする
- 23. 横向きに変更するとAndroidアプリがクラッシュする
- 24. クリック可能なレイアウトのアクティビティを変更する
- 25. Androidアプリの方向変更がアクティビティを再開します
- 26. 外に触れるときにボタンのフォントを変更するには?
- 27. Android:向きを変えながらレイアウトのアニメーションを処理する方法は?
- 28. アクティビティ全体をリフレッシュすることなく、Androidグラフを更新する方法
- 29. Android:向き変更の幅と高さを交換する
- 30. 他のアクティビティに変更することができません
ブライアン、ありがとうございます。しかし、このアプローチでは、アクティビティを一時停止してから再開する必要があります。たぶんそれは私のメッセージからは分かりませんが、私は自分のアクティビティが実行されているときにオリエンテーションの変更を処理し、効果を達成しようとする必要があります。 Android SDKにこれ用のツールがあるかどうかはわかりません)。 – Yurii