Screen Rotation
自己紹介
松村 勇輝
(株)AbemaTV Androidエンジニア
twitter @Yuki_312
blog Yukiの枝折
AbemaTVアプリ
縦画面対応リリース  
画面回転対応
画面回転対応
Portrait/Landscape layout
Activity recreate
Performance
Lifecycle / Scope
画面回転対応
Portrait/Landscape layout
Activity recreate
Performance
Lifecycle / Scope
画面の回転制御
画面の回転制御?
通常 横固定
端末の向きを無視したレイアウト
つまり、横画面固定モード
アプリ要件
• 縦 & 横向きレイアウトのサポート
• 横画面固定モード(*1)を設ける
• *1は, いつでも, どこでもON/OFF可能
• *1がOFFの時は端末設定に従う
どんなアプリ向け?
どんなアプリ向け?
• 横画面と相性が良い
• 大画面で楽しめる
• 強い没入感を提供したい
• 様々な利用シーン
• 外では縦, 家では横向きで使いたい
• 常に横向きで使いたい
需要少ない
Let’s 画面回転制御
ハマりポイント
• 画面の方向を指定する
• Activity起動時の向き
• Action.MAINなActivityの向き
• スタックされたActivityの向き
ハマりポイント
• 画面の方向を指定する
• Activity起動時の向き
• Action.MAINなActivityの向き
• スタックされたActivityの向き
画面の方向を指定する
• 動的な画面方向指定が必要
• AndroidManifestは静的な情報
• 具体的な向きの指定はNG
画面の方向を指定する
android:screenOrientation="landscape"
• 動的な画面方向指定が必要
• AndroidManifestは静的な情報
• 具体的な向きの指定はNG
Activity.setRequestedOrientation(...);
ハマりポイント
• 画面の方向を指定する
• Activity起動時の向き
• Action.MAINなActivityの向き
• スタックされたActivityの向き
Activity起動時の向き
• デフォルトの向きをどうするか?
• 一方向に定めると, 画面遷移の都度,
回転アニメーションが発生する...
Activity起動時の向き
• デフォルトの向きをどうするか?
• 一方向に定めると, 画面遷移の都度,
回転アニメーションが発生する...
android:screenOrientation="unspecified"
android:screenOrientation="behind"
ハマりポイント
• 画面の方向を指定する
• Activity起動時の向き
• Action.MAINなActivityの向き
• スタックされたActivityの向き
Action.MAINなActivityの向き
• behindは使えない
• RotationAnimationで軽減
Action.MAINなActivityの向き
• behindは使えない
• RotationAnimationで軽減
• WindowManager.LayoutParams で指定
• CROSSFADE / JUMPCUT / ROTATE
• 要 FLAG_FULLSCREEN
• 参考: API Demos > App > Activity > Rotation Animation
SplashActivityのワナ
• startActivity後, 即finishする
• 画面回転しながらstartActivityを呼ぶ
SplashActivityのワナ
• startActivity後, 即finishする
• 画面回転しながらstartActivityを呼ぶ
behind指定がうまく動作しないかも
SplashActivityのワナ
• 呼出元がfinishされて参照できない...
• 呼出元のOrientationが未反映...
SplashActivityのワナ
• 呼出元がfinishされて参照できない...
• 呼出元のOrientationが未反映...
挙動はタイミング依存
SplashActivityは回転させない(unspecified)
回転、一度はしかたない
ハマりポイント
• 画面の方向を指定する
• Activity起動時の向き
• Action.MAINなActivityの向き
• スタックされたActivityの向き
スタックされたActivityの向き
• スタックされたActivityに
横画面固定モードのON/OFFを伝搬
• 画面回転はonResumeまで保留される
スタックされたActivityの向き
• スタックされたActivityに
横画面固定モードのON/OFFを伝搬
• 画面回転はonResumeまで保留される
if (横画面固定モード == true) // 横画面UI処理
config = getResources().getConfiguration()
config.orientation ==ORIENTATION_LANDSCAPE
• 画面の方向を指定する
✓ setRequestedOrientation
• Activity起動時の向き
✓ screenOrientation=”behind”
• Action.MAINなActivityの向き
✓ startActivity/finishのタイミングに注意
• スタックされたActivityの向き
✓ Configuration.orientationを参照する
まとめ
• 画面の方向を指定する
✓ setRequestedOrientation
• Activity起動時の向き
✓ screenOrientation=”behind”
• Action.MAINなActivityの向き
✓ startActivity/finishのタイミングに注意
• スタックされたActivityの向き
✓ Configuration.orientationを参照する
まとめ
• 画面の方向を指定する
✓ setRequestedOrientation
• Activity起動時の向き
✓ screenOrientation=”behind”
• Action.MAINなActivityの向き
✓ startActivity/finishのタイミングに注意
• スタックされたActivityの向き
✓ Configuration.orientationを参照する
まとめ
• 画面の方向を指定する
✓ setRequestedOrientation
• Activity起動時の向き
✓ screenOrientation=”behind”
• Action.MAINなActivityの向き
✓ startActivity/finishのタイミングに注意
• スタックされたActivityの向き
✓ Configuration.orientationを参照する
まとめ
横画面固定モードこわくない
以上
ご清聴ありがとうございました

Screen Orientation