Android マーケットプレイスで最新の YouTube アプリの機能を複製しようとしています。ビデオを視聴する場合、2 つの個別のレイアウトがあります。1 つは追加情報を提供する縦向きで、もう 1 つはビデオの全画面表示を提供する横向きです。
縦向きモードの YouTube アプリ
横向きモードの YouTube アプリ
(ランダムな写真で申し訳ありませんが、実際のレイアウトを見つけることができた最初の写真でした)
通常、これは非常に簡単に実行できます。layout-land で別のレイアウトを指定するだけで、すべてうまくいきます。YouTube アプリが非常にうまく機能していること (そして私が再現しようとしていること) は、向きが変わってもビデオが再生され続け、最初から再バッファリングする必要がないことです。
onConfigurationChange() をオーバーライドして新しい LayoutParameters を設定すると、再バッファリングを強制せずにビデオのサイズを変更できることがわかりましたが、画面を複数回回転させると、ビデオは異なる幅/高さにランダムにスケーリングされます。私は VideoView であらゆる種類の invalidate() 呼び出しを試み、親の RelativeLayout コンテナーで RequestLayout() を呼び出して、できるだけ多くの異なることを試してみましたが、正しく動作するようには見えません。どんなアドバイスでも大歓迎です!
これが私のコードです:
@Override
public void onConfigurationChanged(Configuration newConfig) {
super.onConfigurationChanged(newConfig);
if (newConfig.orientation == Configuration.ORIENTATION_LANDSCAPE) {
questionText.setVisibility(View.GONE);
respond.setVisibility(View.GONE);
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, LayoutParams.FILL_PARENT));
} else {
questionText.setVisibility(View.VISIBLE);
respond.setVisibility(View.VISIBLE);
Resources r = getResources();
int height = (int) TypedValue.applyDimension(TypedValue.COMPLEX_UNIT_DIP, 150.0f, r.getDisplayMetrics());
questionVideo.setLayoutParams(new RelativeLayout.LayoutParams(LayoutParams.FILL_PARENT, height));
}
}
編集: logcat で、ビデオを回転させたときに発生する興味深い出力を発見しましたが、これが原因であると思われますが、修正方法はわかりません:
適切にサイズ変更したときの Logcat 出力 (ウィンドウ全体を占有)
h=726 に注意してください
12-13 15:37:35.468 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=210}
12-13 15:37:35.561 1262 1268 I TIOverlay: Position/X0/Y76/W480/H225
12-13 15:37:35.561 1262 1268 I TIOverlay: Adjusted Position/X1/Y0/W403/H225
12-13 15:37:35.561 1262 1268 I TIOverlay: Rotation/90
12-13 15:37:35.561 1262 1268 I Overlay : v4l2_overlay_set_position:: w=480 h=224
12-13 15:37:35.561 1262 1268 I Overlay : v4l2_overlay_set_position:: w=402 h=726
12-13 15:37:35.561 1262 1268 I Overlay : dumping driver state:
12-13 15:37:35.561 1262 1268 I Overlay : output pixfmt:
12-13 15:37:35.561 1262 1268 I Overlay : w: 432
12-13 15:37:35.561 1262 1268 I Overlay : h: 240
12-13 15:37:35.561 1262 1268 I Overlay : color: 7
12-13 15:37:35.561 1262 1268 I Overlay : UYVY
12-13 15:37:35.561 1262 1268 I Overlay : v4l2_overlay window:
12-13 15:37:35.561 1262 1268 I Overlay : window l: 1
12-13 15:37:35.561 1262 1268 I Overlay : window t: 0
12-13 15:37:35.561 1262 1268 I Overlay : window w: 402
12-13 15:37:35.561 1262 1268 I Overlay : window h: 726
不適切なサイズ変更時の Logcat 出力 (全画面のごく一部を占める)
h=480 に注意してください
12-13 15:43:00.085 1262 1270 I ActivityManager: Config changed: { scale=1.0 imsi=310/4 loc=en_US touch=3 keys=1/1/2 nav=1/1 orien=2 layout=34 uiMode=17 seq=216}
12-13 15:43:00.171 1262 1268 I TIOverlay: Position/X0/Y76/W480/H225
12-13 15:43:00.171 1262 1268 I TIOverlay: Adjusted Position/X138/Y0/W266/H225
12-13 15:43:00.171 1262 1268 I TIOverlay: Rotation/90
12-13 15:43:00.179 1262 1268 I Overlay : v4l2_overlay_set_position:: w=480 h=224
12-13 15:43:00.179 1262 1268 I Overlay : v4l2_overlay_set_position:: w=266 h=480
12-13 15:43:00.179 1262 1268 I Overlay : dumping driver state:
12-13 15:43:00.179 1262 1268 I Overlay : output pixfmt:
12-13 15:43:00.179 1262 1268 I Overlay : w: 432
12-13 15:43:00.179 1262 1268 I Overlay : h: 240
12-13 15:43:00.179 1262 1268 I Overlay : color: 7
12-13 15:43:00.179 1262 1268 I Overlay : UYVY
12-13 15:43:00.179 1262 1268 I Overlay : v4l2_overlay window:
12-13 15:43:00.179 1262 1268 I Overlay : window l: 138
12-13 15:43:00.179 1262 1268 I Overlay : window t: 0
12-13 15:43:00.179 1262 1268 I Overlay : window w: 266
12-13 15:43:00.179 1262 1268 I Overlay : window h: 480
おそらく誰かが「オーバーレイ」とは何か、そしてなぜ正しい高さの値を取得していないのか知っていますか?