TV(电视)应用开发指南
前陣子將一個手機(jī)APP改為TV應(yīng)用,由于首次開發(fā)TV,故把開發(fā)過程中的一些問題記錄下來,以備不時之需。電視應(yīng)用和手機(jī)應(yīng)用開發(fā)過程大同小異,電視應(yīng)用主要注意三個地方:1是清單文件,2是布局文件,3是處理好控件獲取焦點時的背景顯示,因為對于沒有觸控功能的電視設(shè)備,用戶想要點擊某個控件時,只能先操作遙控器的方向鍵將焦點移到該控件上,接著才能按遙控器的確定鍵執(zhí)行點擊,所以就需要處理好控件獲取焦點時的背景顯示(區(qū)別于沒有獲取焦點的其他控件),以便用戶能一眼看出來現(xiàn)在是哪個控件在獲取焦點并可點擊。
1.清單文件需要改的地方
1.1 處理電視可能不支持的硬件功能
電視上的android系統(tǒng)一般不支持以下硬件功能:
因此,需要在清單文件中將以上特性聲明為非必須的,你的應(yīng)用才能安裝在不支持這些特性的電視上,如下:
當(dāng)然,如果你的應(yīng)用的某個功能需要用到以上某個特性,你應(yīng)該在代碼中判斷設(shè)備是否支持改特性,以便做出對應(yīng)的處理邏輯,怎么判斷呢:
是否支持撥打電話:
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TELEPHONY)) {//支持電話撥打}是否觸摸屏
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_TOUCHSCREEN)) {//是觸摸屏}是否可開啟相機(jī)
if (getPackageManager().hasSystemFeature(PackageManager.FEATURE_CAMERA)) {//可開啟相機(jī)}其他特性判斷就不再贅述。
1.2 application節(jié)點下
如上圖,應(yīng)用的啟動圖除了提供常規(guī)的手機(jī)APP的logo外,還需要另外提供一張橫幅圖片放在banner屬性下,什么是橫幅?請看下圖:
橫幅圖片分辨率一般建議320*180的,放在xhdpi的圖片資源目錄下。
另外,當(dāng) TV 應(yīng)用啟動時,系統(tǒng)會顯示動畫,就像一個不斷膨脹的實心圓。要自定義此動畫的顏色,請將 TV 應(yīng)用或 Activity 的 android:colorPrimary 屬性設(shè)為特定顏色。此外,還應(yīng)將另外兩個過渡重疊屬性設(shè)為 true,如主題背景資源 XML 文件中的以下代碼段所示:
<resources><style ... ><item name="android:colorPrimary">@color/primary</item><item name="android:windowAllowReturnTransitionOverlap">true</item><item name="android:windowAllowEnterTransitionOverlap">true</item></style></resources>1.3 啟動頁
電視應(yīng)用的啟動頁需要將intent-filter的categorycategory值從LAUNCHER改為LEANBACK_LAUNCHER:
<intent-filter><action android:name="android.intent.action.MAIN"/><category android:name="android.intent.category.LEANBACK_LAUNCHER"/></intent-filter>否則,你的應(yīng)用將不會在電視桌面或橫幅列表上顯示出來,反正,LEANBACK_LAUNCHER的電視應(yīng)用也不會在手機(jī)桌面顯示。
1.4 啟動activity的config配置
config屬性需要配置navigation值,因為當(dāng)用戶在操作鍵盤方向鍵切換導(dǎo)航時,activity是會重走生命周期方法的,這是為了不讓其重走生命周期方法:
另外,電視應(yīng)用不支持豎屏顯示,所以我們可以直接在清單文件中將activity的屏幕方向限定為橫屏.
2.布局文件
2.1 由于電視應(yīng)用都是橫屏顯示,所以界面布局文件要放在layout-land目錄下。
2.2 電視沒有狀態(tài)欄,所以應(yīng)用主題最好用NoActionBar的。
2.3 對于沒有觸控功能的電視,fragment的切換最好不要借助Viewpage來管理
2.4 對于界面內(nèi)容過長時,根布局最好用NestedScrollView
3.處理焦點
3.1 為了控件能響應(yīng)遙控器的方向鍵切換時獲取焦點,需要將控件的focusable屬性設(shè)為true,這樣設(shè)置過后,你會發(fā)現(xiàn)當(dāng)將應(yīng)用裝在具有觸控功能的設(shè)備時,點擊這個控件時,需要點擊兩次才執(zhí)行,這是因為控件要先走focused,才走onclick,為了避免這種情況,再將focusable屬性設(shè)為true后,記得同時顯性的將控件的clickable也設(shè)為true。
3.2 對于幾個同一級別或類型的ImageView,為了區(qū)分當(dāng)前是哪張圖片獲得焦點,可以用放大的方式將獲取焦點圖片區(qū)別出來,如下圖:
仔細(xì)看上圖,“撥號”圖片當(dāng)前是獲取焦點的,它相對于其他三張圖片放大了。要想圖片獲取焦點時放大,不獲取焦點時縮小到正常水平,其實只需要重寫AppCompatImageView的onFocusChanged方法即可:
3.3 對于幾個同一級別或類型的TextView,區(qū)分的方式可以包括縮放、文字顏色等,看下圖:
上圖的“撥號”和“通訊錄”分別是兩個Fragment的導(dǎo)航標(biāo)題,當(dāng)前獲取焦點的是“撥號”的TextView,獲取焦點時放大了,并且文字顏色為純白色,相較于“通訊錄”,還是很容易看得出來的。下面是重新改TextView的代碼
3.4 區(qū)別RecyclerView中的哪個Item獲取焦點
同樣的,為了時recyclerview的itemitem能夠獲取焦點,需要給item的布局根節(jié)點設(shè)置focusable為true,clickable為true。還是看上面那個撥號界面:
當(dāng)前獲取焦點的是RecyclerView中的第二個item,我這里是顯示了一個紅色的線框來區(qū)別,當(dāng)然,你也可以對這個item放大來區(qū)別,或者周邊高亮陰影來區(qū)別。下面代碼是該item中的狀態(tài)背景:
3.5 監(jiān)聽用戶是否按下了遙控
這個場景主要是用于當(dāng)監(jiān)聽到用戶按下了遙控建時做對應(yīng)的邏輯,例如視頻播放界面,當(dāng)全屏播放時,用戶一段時間不操作遙控后,就隱藏某些按鈕,當(dāng)用戶按下遙控時,再顯示隱藏的按鈕,只需要重寫Activity的onKeyDown方法即可:
@Overridepublic boolean onKeyDown(int keyCode, KeyEvent event) {if ((event.getSource() & InputDevice.SOURCE_DPAD)!= InputDevice.SOURCE_DPAD) {//用戶按了遙控}return super.onKeyDown(keyCode, event);}3.5 處理導(dǎo)航
一般不需要處理用戶操作遙控器方向鍵(上、下、左、右)時的導(dǎo)航順序,如果有這個需求,可以根據(jù)下面屬性在布局文件中指定你的導(dǎo)航順序:
如果你想在最后一個控件獲取焦點后,繼續(xù)按右方向鍵的話導(dǎo)航到第一個控件,那么你只需要將最后一個控件中nextFocusRight的值設(shè)為第一個控件的id即可。
總結(jié)
以上是生活随笔為你收集整理的TV(电视)应用开发指南的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 数据库基础学习-计划内容 For 小样儿
- 下一篇: 银行对公业务和对私业务