フリーフォーム マルチウィンドウ モードは、Android Nougat の機能として十分に活用されておらず、十分に評価されていません。 それが何であるか、そして開発者がそれをどのように組み込むことができるかについて説明します。
Android 7.0 Nougat が 2016 年の初めに初めて発表されたとき、Android プラットフォームに多くの要望があった機能、つまりマルチウィンドウ サポートが導入されました。 ほとんどの人は、すべての Android Nougat スマートフォンおよびタブレットで、分割画面マルチウィンドウのサポートがデフォルトで有効になっていることを知っています。 Android Nougat を搭載した Android TV デバイスには、ピクチャ イン ピクチャ マルチウィンドウ サポートが付属しています。
ただし、Android Nougat には、あまり知られていない 3 番目のマルチウィンドウ モードがあります。 フリーフォームウィンドウモード. このモードを使用すると、Android は、ユーザーが自由に移動したりサイズ変更したりできるフローティング ウィンドウとしてアプリを表示できます。 これは本質的に Android の実装です。 スタッキングウィンドウマネージャー.
の中に Android SDK ドキュメント、それは次のように述べています。
大型デバイスのメーカーは、ユーザーが各アクティビティのサイズを自由に変更できるフリーフォーム モードを有効にすることを選択できます。 メーカーがこの機能を有効にしている場合、デバイスは分割画面モードに加えてフリーフォーム モードを提供します。
そしてまた、 Android 7.0 CDD:
画面サイズが xlarge のデバイス実装は、フリーフォーム モードをサポートする必要があります (SHOULD)。
これは、Android 7.0 を搭載した新しい大画面 Android デバイスでは、メーカーによってフリーフォーム ウィンドウ モードが有効になっている可能性があることを示しています。
ただし、これは決して難しい要件ではありません。 強制することも可能です どれでも Android Nougat デバイス (開発者向けオプションが有効になっている) は、次の 2 つの異なる方法のいずれかを使用してフリーフォーム ウィンドウ モードをサポートします。
Android Nougat デバイスでフリーフォーム ウィンドウ モードを有効にする
方法 1 (adb がインストールされたコンピューターが必要です)
開発者向けオプションで USB デバッグが有効になっていることを確認してください。 次に、adb がインストールされているコンピューターにデバイスを接続し、次のコマンドを実行します。
adb shell settings put global enable_freeform_support 1
方法 2 (追加の要件なし)
開発者向けオプションの下部にある「アクティビティを強制的にサイズ変更可能にする」オプションを有効にします。
これらの方法はどちらも、有効にする前にシステム UI を再起動する必要があります。 これを行う最も簡単な方法は、デバイスを再起動することです (または、デバイスがルート化されている場合は、単純に com.android.systemui
プロセス)
さて、フリーフォーム モードが有効になりました…さてどうするでしょうか?
方法 1 を使用してフリーフォーム モードを有効にした場合、[概要] メニューのアプリ エントリに、アプリをフリーフォーム ウィンドウ モードで起動するための新しいボタンが表示されます。
ただし、方法 2 では、Android 自体からアプリをフリーフォーム モードで起動することはできません。 幸いなことに、 サードパーティのランチャーでアプリをフリーフォーム ウィンドウ モードで起動することが可能です API レベル 24 の一部として最終化された標準 Android API を使用します。
フリーフォーム モードでアプリを起動する鍵は、 ActivityOptions.setLaunchBounds()
方法。 このメソッドは Rect
引数として、アプリを起動するウィンドウの境界を含みます。
その後、次のようにしてアプリを起動できます startActivity(Intent, Bundle)
. まだお持ちでない場合は、 ActivityOptions
バンドル、次のものを使用して作成できます ActivityOptions.makeBasic()
そして電話をかける setLaunchBounds()
新しく作成されたバンドルで。
デフォルトでは、概要画面にアプリのタスクがすでに存在する場合、 Android は、以前に起動された既存の (全画面) タスクに単純にリダイレクトします。 ユーザー。 フリーフォーム ウィンドウでアプリを起動する前に、概要でアプリのタスクをすべてクリアする必要があります。 (で起動するアクティビティを備えたアプリの場合) standard
または singleTop
モードに追加することで、新しいウィンドウを強制的に開くことができます。 Intent.FLAG_ACTIVITY_MULTIPLE_TASK
呼び出す前に意図にフラグを立てる startActivity()
.)
フリーフォーム モードは内部的にどのように機能しますか?
がある 素晴らしい記事 フリーフォーム モードを含むマルチ ウィンドウ モードが Android Nougat にどのように実装されるかを説明する文書です。 (注: この記事は中国語で書かれているため、必ず Google 翻訳を使用してください)
簡単に言うと、フリーフォーム モードのアプリは、システムの残りの部分とは別のスタックで実行されます (仮想デスクトップを考えてください)。 したがって、フリーフォーム アプリをランチャー上や別の全画面アプリ上で実行することはできません。
フリーフォーム モードで実行されているアプリ ( android: windowIsFloating
true に設定) DecorCaptionView
最上位の子として追加される DecorView
. このビューには、 LinearLayout
ウィンドウの移動、最大化、および閉じるためのウィンドウのキャプション バーを定義します。 個人的にはお勧めしませんが、 DecorView
を使用して Window.getDecorView()
にキャストして、 ViewGroup
そしてその子ビューにアクセスします。
Android の標準の分割画面マルチウィンドウ モードで適切に動作するように設計されたアプリはすべて、フリーフォーム モードで動作します。 isInMultiWindowMode()
フリーフォーム モードで実行されているアプリの場合は true を返します。 特にフリーフォーム モードに関連する、アプリで使用できる公開されているクラスとメソッドが他にもいくつかあります。
-
Window.setDecorCaptionShade()
: このメソッドは、フリーフォーム モードのアプリのキャプション コントロール (最大化ボタンと閉じるボタン) のシェードをオーバーライドするために使用できます。 -
Window.setRestrictedCaptionAreaListener()
: これは、ウィンドウがフリーフォーム モードで移動されたときを検出するために使用できます。 のWindow.OnRectrictedCaptionAreaChangedListener
キャプション コントロールの位置が変更されるたび (ユーザーがウィンドウを移動するとき) に呼び出され、Rect
キャプション コントロールの新しい境界を使用します。 -
ActivityInfo.WindowLayout
: このクラスには、アプリが起動時にリクエストできるフリーフォーム ウィンドウの初期位置に関して、アプリのマニフェストで宣言された情報が含まれています。 たとえば、次のようにリストできます。 マニフェストのタグ:
その後、デバイスがすでにフリーフォーム モードになっていてアプリが起動されると、これらの指定された境界で起動します。android: defaultHeight="640dp"
android: defaultWidth="360dp"
android: gravity="center" />
フリーフォーム ウィンドウ モードの動作例
2016 年の夏、Android Nougat がまだ開発者プレビューだったときに、私は というアプリをリリースしました。 タスクバー Windows のようなスタート メニューと、システム オーバーレイで最近使用したアプリのリストを提供します。 これにより、Nougat のユーザーはフリーフォーム ウィンドウ モードでアプリを起動できるようになります。また、タスクバーはオーバーレイを使用するため、フリーフォーム ウィンドウ環境でも画面上にとどまることができます。 タスクバーとフリーフォーム モードを組み合わせると、Android デバイス、特にタブレットに PC のような操作感が与えられます。
あなたはできる タスクバーをダウンロード Google Play、または ソースコードを見る GitHub 上で自分自身を操作します。 この記事で説明した概念に加えて、画面上にフリーフォーム ウィンドウが表示されていない場合でも、フリーフォーム モード環境をアクティブに保つためのいくつかのトリックも採用しています。 ユーザーはオプションでタスクバーをデフォルトのランチャーとして設定し、デバイスが自動的にフリーフォーム モード環境で起動できるようにすることもできます。
(この記事の執筆時点では) OEM によって有効になっているフリーフォーム ウィンドウのサポートを正式に搭載して出荷されるデバイスはないため、 タスクバーを、他の方法ではサポートされていないデバイス上のフリーフォーム ウィンドウ環境で開発者がアプリをテストするためのツールとして使用する それ。
タスクバーに加えて、AOSP の Launcher3 ソース コードも変更して、アプリをフリーフォーム モードで起動できるようにしました。 これは、標準の Android 7.1.1 ランチャーのストレート クローンであり、フリーフォーム アプリを起動できるようにするために必要な最小限の変更が加えられています。 他の開発者がカスタム ランチャーでフリーフォーム ウィンドウの起動のサポートを実装することを期待して、この変更されたランチャーを提供しました。 あなたはできる ソースコードを見る GitHub 上、または サンプルAPKをダウンロードする.
私の希望は、カスタム ランチャーの開発者がこのコードを利用して、フリーフォームの起動をサポートできるようになることです。 大画面でのウィンドウ管理の柔軟性を高めることを望むユーザー向けのウィンドウ アプリ デバイス。