モバイルアプリをAndroid TVに適合させるか、Googleが好きな理由

モバイルアプリケーションの開発者である私たちは、家族の位置を特定するための基礎として地理位置情報を使用しているため、Android TVにアプリケーションを配置することすら考えていません。

Googleがコンテストを開催しており、開発時にAndroid TVコンソールをテストするために開発者を親切に提供しているのを見たとき、次の会議でそれが私たちにとってどれほど面白いかを考えました。 そして議論の過程で、Android TVの非常に興味深い機能が発見されました。そのため、アプリケーションを適合させる価値がありました。 しかし、まず最初に...


Google Lab Labコンテストの一部としてのIvan Korolによる記事

準備する


適応を開始する前に、友人や知人からのこれらのコンソールの使用に関する統計を少し調べました。 それらのほとんどは、あなたがそれを推測し、それを使ってテレビのコンテンツを見たり、ゲームをプレイしたりします。 私たちのアプリケーションはどちらでもありませんが、その実用的な利点を固く信じていたため、この段階では引き下げませんでした。

仕事の特徴を学ぶ


開発が始まる前は、馴染みのあるタッチスクリーンがないため、適応が怖かったです。 適応には、アプリケーションが機能するためにコードを大幅に変更する必要があると考えました。 しかし、それはすべて次の重要なポイントに行き着きました。

Dパッド
ほとんどのテレビセットトップボックスを制御するために、ユーザーはリモコンを使用し、携帯電話のようにテレビを指で突かないでください。 これが開発の主な違いです。 モバイルデバイス用に開発するときに画面領域をクリックして何かが発生した場合、Android TVでは上、下、左、右矢印を使用してすべてのアクションを実行します。それにより、関心のある要素に焦点を合わせてから選択ボタンを押すだけですこの要素のアクティブなイベントを呼び出します。

縦向き
アプリケーションが縦向きのみを使用する場合、まず横向きのアプリケーションを準備し、マニフェストファイルで縦向きを必要としないことを言う必要があります。

<!--   ,       --> <uses-feature android:name="android.hardware.screen.portrait" android:required="false" /> 

必要条件
Android TVを使用するには、マニフェストファイルで次のデバイス要件をオプションにします。

 <!--            TV --> <uses-feature android:name="android.software.leanback" android:required="false" /> <!--      touchscreen --> <uses-feature android:name="android.hardware.touchscreen" android:required="false" /> <!--   ,      --> <uses-feature android:name="android.permission.ACCESS_FINE_LOCATION" android:required="false" /> <!--   ,       --> <uses-feature android:name="android.hardware.telephony" android:required="false" /> <!--   ,      --> <uses-feature android:name="android.permission.RECORD_AUDIO" android:required="false" /> 

他の権限がある場合は、Android TVの公式開発ガイドをご覧ください。

テレビでの最初の起動


それでは、適応を始めましょう。 まず、Android TVが起動時に起動するアクティビティを作成する必要があります。 Android TVを起動する特別な起動(スプラッシュ)アクティビティを作成しました。 その結果、電話用とテレビ用の2つの起動可能なアクティビティを取得しました。 その後、アプリケーションのメインアクティビティが既に起動され、携帯電話とテレビの両方ですべてが同じように機能しました。 マニフェストでは、次のようになりました。

 <!-- TV SPLASH --> <activity android:name=".Frontend.Activities.TVActivity" android:theme="@style/FullscreenTheme" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> </intent-filter> </activity> <!-- Mobile SPLASH --> <activity android:name=".Frontend.Activities.SplashActivity" android:configChanges="orientation|keyboardHidden|screenSize" android:theme="@style/FullscreenTheme" android:noHistory="true"> <intent-filter> <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LAUNCHER" /> </intent-filter> </activity> 

Android TVが起動時に起動するアクティビティの種類を理解するために、特別なインテントフィルターパラメーターが使用されます。

 <action android:name="android.intent.action.MAIN" /> <category android:name="android.intent.category.LEANBACK_LAUNCHER" /> 

TVエミュレーターでアプリケーションを起動すると、スプラッシュ画面が表示されます。



フォーカス


テレビでアプリケーションを起動した後、マウスを忘れて、キーボードからの矢印でのみエミュレータウィンドウを制御する必要があります。 しかし、最初のプレスでは何も起こりません。Androidに、矢印(Dパッド)をクリックしてどの要素とどの順序でフォーカスするかを通知する必要があるからです。 まず、要素に焦点を合わせましょう。 これを行うには、アクティビティのマークアップで要素を選択し、それにfocusable = true属性を追加します。

 <LinearLayout android:id="@+id/btn_new_family" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:focusable="true" /> 

この属性は、要素がフォーカスを取得できることを示します。 ただし、テレビではなく、通常のタッチスクリーン携帯電話でテストする場合は、android属性も設定する必要があります:focusableInTouchMode =“ true”。 アクティブな要素にフォーカス可能な属性を設定したら、フォーカス後に発生する「効果」を指定する必要があります。 これを行うには、特別なXMLセレクターであるBackground属性を割り当てます。

 <LinearLayout android:id="@+id/btn_new_family" android:layout_width="match_parent" android:layout_height="wrap_content" android:orientation="horizontal" android:focusable="true" android:background="@drawable/focusable " /> 

次に、単純なfocusable.xmlセレクタファイルの例を示します。このファイルでは、要素の背景を濃い青で色付けしています。

 <?xml version="1.0" encoding="utf-8"?> <selector xmlns:android="http://schemas.android.com/apk/res/android"> <item android:state_focused="true" > <layer-list> <item android:id="@+id/id"> <shape> <solid android:color="#0277bd"/> </shape> </item> </layer-list> </item> </selector> 

既に独自のセレクターがある場合は、android:state_focused要素を追加して、必要なスタイルを設定するだけです。
次のような結果になるはずです(GIFアニメーション):



それだけです さて、いくつかの要素の上にマウスを移動してDパッドの中央のボタンを押すと、画面のこの領域をクリックしたかのように、Clickイベントが発生します。

プログラムフォーカス制御


プログラムコードから動的に作成するインターフェイス要素がある場合、次のコードを使用してフォーカスを追加できます。

 element.setFocusable(true); element.setBackground(ContextCompat.getDrawable(this, R.drawable.focusable)); 

最初の行は、フォーカスする機能を追加します。 2番目はセレクタを設定します。 次のコマンドを実行することにより、プログラムで特定の要素にフォーカスを設定できます。

 element.requestFocus(); 

追加機能


デフォルトでは、要素間の遷移順序は上から下、左から右になります。 順序を変更する必要がある場合、たとえば、Dパッドで下矢印を最初に押した後、すぐに画面を下に移動してから、特別な属性を使用します。

 <View android:nextFocusDown="@id/bottom_view" android:nextFocusUp="@id/top_view" android:nextFocusLeft="@id/left_view" android:nextFocusRight="@id/right_view" /> 

また、Androidには、LeanbackサポートライブラリのTheme.Leanbackという特別なテーマがあり、API 17で利用できます。しかし、アプリケーションのデザインがテレビに完全にフィットするため、それは余分であることがわかりました。

ご覧のとおり、アプリケーションをテレビに適応させることは難しくありません。そのため、Googleが大好きです。 すべてが単純すぎて、タンバリンと踊りません。 Android TVでは、開発者はアプリケーションの最大限の互換性をすでに慎重に取り入れています。 動作させるにはかなりの時間が必要です。 もちろん、1つの記事の枠組み内では、有能な適応のささいなことすべてを説明することはできませんが、上記の手順を実装することで、アプリケーションはすでにAndroid TVで適切に提示され、新しいソファファンを獲得します!

Source: https://habr.com/ru/post/J310514/


All Articles