fkm blog

software開発に関することを書いていきます

Google I/O 2019: Build Apps for Foldable, Multi-Display, and Large-Screen Devices

折りたたみスマホや、複数ディスプレイに関するセッション

youtu.be

Foldable Device

折りたたみデバイスには2種類ある

fold in: 谷折り。ディスプレイ名が重なるように折りたたむ。Galaxy Foldがこちら fold out: 山折り。ディスプレイが外側になるように折りたたむ。Huaway Mate Xがこちら(出るのかなこれ。。。

fold inはディスプレイが3枚分あるの??

Androidはこの折りたたみをサポートする。

UXに関して

広げたときは、大画面になるので動画再生やゲームに最適

折りたたんでいるときは、通常の電話と同じような体験に。

また、広げたときはウィンドウを2つ並べてマルチタスクとしても使える。

アスペクト比

minAspectRatiomaxAspectRatio で、サポートするスクリーンのアスペクト比を制限することができる。

最小幅

最低でも2インチあることが保証されるように。下ナビゲーションにアイコン5つギリ入る幅。Jelly Proみたいな端末は出せなくなる?

アプリの連続性

折りたたんだり、元に戻したりしたとき、ユーザーの状態をロストしないようにしよう。折りたたんだら動画再生が先頭から みたいなのは悪い体験。configurationの変更として扱われるので、画面回転と同じようなものとして捉えればOK。

android:resizableActivity="false" にしても、configurationの変更でサイズを変更しなければならない場面がある点に注意。このフラグはアクティビティがマルチウィンドウやマルチディスプレイ環境に対応してるかだけを表すフラグ。

Android Qでは、マルチウィンドウと画面回転の両方に対応しないアプリのためにCompat modeが用意されている。この場合、折りたたみ環境で広げた状態ではiPadのように真ん中に縦長のアクティビティが表示される。

マルチウィンドウ

Android Qではマルチレジュームという機能が導入される。これはマルチウィンドウの状態で、複数のアプリがRESUMED状態(=ユーザーからの操作を受け付ける状態)になること。

アクティビティがPAUSED状態になるのは、 - 上に透明なアクティビティが重なった - フォーカスがあたらない状態(例えばPicture in Picture modeとか)になった

マルチレジュームで考えないといけないのは、排他的に使うべきリソースにアクセスする場合。例えばカメラやマイクとか。当然複数のアプリ間で同時に使うことはできないので、ちゃんとdisconnectのイベントを処理し、使えるようになったら再接続するような実装が必要。動画ではカメラアプリを同時に3つ起動する例が示されている。

resizableActivity="false" としても、カメラへのアクセスが保証されるわけではないので注意。

「使えるようになったら」のためのコールバックとして、 onTopResumedActivityChanged(topResumed: bool) が追加されている。 true が渡されたらカメラとかへのアクセス権がもらえている。

ドラッグ&ドロップも考える必要がある。機能自体はNぐらいから導入されてるのと同じ(Nだったかは要調査)。

1Passwordの例。リサイズに対応し、ドラッグ&ドロップ(持ち出す方)に対応。アプリから離れるとロックする機能をいれていたが、リサイズするたびにロックされてしまうという問題に直面した。アクティビティのライフサイクルに対する理解を改め、なんとかしたっぽい。

続いてGameloftの例。Device unknownというのをつくり、あらゆる仮定(スクリーンサイズやピクセル密度など)を排除して考えてみた。エディタは画面の要素をアンカーベースで配置してもらい、いつ画面のサイズが変わっても大丈夫なようにしてもらった。

マルチディスプレイ

アクティビティを別のディスプレイに持っていったとき、コンテキストも変わってしまう。アクティビティコンテキストは、今表示されているディスプレイの情報がとれる。逆にアプリケーションコンテキストでディスプレイの情報と取ってしまうと、意図しない情報がとれたりする。

トーストの表示も、アクティビティコンテキストの影響を受ける。引数で渡したアクティビティが表示されている側にトーストが表示されるようになっている。

configurationの変更イベントの中には、「タッチ可能の有無が変更された」などもある。例えばスマホの画面にいたアクティビティが、外付けのディスプレイに移動したときなど。

マルチディスプレイを扱うには、 DisplayManager 経由で各ディスプレイの情報がとれる。 startActivity() のオプションに、どのディスプレイで起動するかを渡すことができる。またディスプレイによってはアクティビティの起動が禁止されているものもある。その場合は SecurityException が投げられる。Android Qでは、そのディスプレイで起動可能かをチェックするためのAPIが追加されている。

セカンドディスプレイにソフトキーボードを表示することもできる。その場合、キーボードもディスプレイ間を移動することになる。

壁紙もディスプレイ毎に用意できる。

テストについて

こんな変態的な環境を用意するのはたいへん。なのでエミュレーターで折りたたみがサポート。7.3インチと8インチを現時点で用意している。将来的にはもっと増えるみたい。

マルチディスプレイは、開発者オプションで「強制デスクトップモード」がAndroid Qに追加されている。もし端末にHDMI出力があれば、マルチディスプレイで動作させることもできる。

デベロッパーガイドは https://developer.android.com/preview/features/foldables にある。