編輯:關於Android編程
github對應地址:https://github.com/hejunlin2013/TVSample,截至到當前發稿,已突破200star,如果喜歡的話,可以star,也表示下支持,今天主要總結下TV開發中有焦點問題。
在TV開發中沒有以前我們phone端的dispatchTouchEvent、onInterceptTouchEvent、onTouchEvent 事件來分發,而需要使用dispatchKeyEvent、onKeyDown、onKeyLisenter 等事件來分發處理焦點事件傳遞,而且TV端焦點沒有什麼好辦法可以全局控制,本篇做應用場景補充說明及遇到有坑,看下Agenda:
采用Android自帶的直接控制焦點上下左右 采用setOnFocusChangeListener控制焦點 adb按鍵派發控制焦點 遇到的坑-遙控器按鍵失靈案列Android TV 開發與一般Android開發最大的區別在於焦點控制 , 用戶在使用Android TV設備主要是通過遙控器操作app。焦點就是讓用戶知道的直接交互行為。 然而一些app,依據系統對focus的判斷,會出現的狀況: 上下導航時,不是想要的結果. 邊緣移動時,會出現焦點丟失的狀況. 有時想直接定位到某個位置上.
android提供了一些焦點相關的屬性,在現有的框架層下通過設置View的屬性來獲得焦點
采用Android自帶的直接控制焦點上下左右的方法
因此在進行布局時有必須要通過view.setId(…)指定view的特定ID,然後通過view.setNextLeftView(…)等四個方法控制該view的上下左右移動後所到達的view。然而這種方法只適用於前提就設置好ID的場景,不適合動態布局的場景。
看如下一段布局:
看如下一段代碼:
按鍵的派發須了解一此KeyCode,下面是平時用到的主要的一些方向鍵:
當設置View.setFocusable(true); 改變控件是否可以獲得焦點,然而同時會觸發 setOnFocusChangeListener事件
在adb中,可以通過注入的方式模擬按鍵,如 adb shell input keyevent 3 給示模擬Home鍵
以下是的KEYCODE供參考:
KEYCODE_UNKNOWN=0; KEYCODE_SOFT_LEFT=1; KEYCODE_SOFT_RIGHT=2; KEYCODE_HOME=3; KEYCODE_BACK=4; KEYCODE_CALL=5; KEYCODE_ENDCALL=6; KEYCODE_0=7; KEYCODE_1=8; KEYCODE_2=9; KEYCODE_3=10; KEYCODE_4=11; KEYCODE_5=12; KEYCODE_6=13; KEYCODE_7=14; KEYCODE_8=15; KEYCODE_9=16; KEYCODE_STAR=17; KEYCODE_POUND=18; KEYCODE_DPAD_UP=19; KEYCODE_DPAD_DOWN=20; KEYCODE_DPAD_LEFT=21; KEYCODE_DPAD_RIGHT=22; KEYCODE_DPAD_CENTER=23; KEYCODE_VOLUME_UP=24; KEYCODE_VOLUME_DOWN=25; KEYCODE_POWER=26; KEYCODE_CAMERA=27; KEYCODE_CLEAR=28; KEYCODE_A=29; KEYCODE_B=30; KEYCODE_C=31; KEYCODE_D=32; KEYCODE_E=33; KEYCODE_F=34; KEYCODE_G=35; KEYCODE_H=36; KEYCODE_I=37; KEYCODE_J=38; KEYCODE_K=39; KEYCODE_L=40; KEYCODE_M=41; KEYCODE_N=42; KEYCODE_O=43; KEYCODE_P=44; KEYCODE_Q=45; KEYCODE_R=46; KEYCODE_S=47; KEYCODE_T=48; KEYCODE_U=49; KEYCODE_V=50; KEYCODE_W=51; KEYCODE_X=52; KEYCODE_Y=53; KEYCODE_Z=54; KEYCODE_COMMA=55; KEYCODE_PERIOD=56; KEYCODE_ALT_LEFT=57; KEYCODE_ALT_RIGHT=58; KEYCODE_SHIFT_LEFT=59; KEYCODE_SHIFT_RIGHT=60; KEYCODE_TAB=61; KEYCODE_SPACE=62; KEYCODE_SYM=63; KEYCODE_EXPLORER=64; KEYCODE_ENVELOPE=65; KEYCODE_ENTER=66; KEYCODE_DEL=67; KEYCODE_GRAVE=68; KEYCODE_MINUS=69; KEYCODE_EQUALS=70; KEYCODE_LEFT_BRACKET=71; KEYCODE_RIGHT_BRACKET=72; KEYCODE_BACKSLASH=73; KEYCODE_SEMICOLON=74; KEYCODE_APOSTROPHE=75; KEYCODE_SLASH=76; KEYCODE_AT=77; KEYCODE_NUM=78; KEYCODE_HEADSETHOOK=79; KEYCODE_FOCUS=80;//*Camera*focus KEYCODE_PLUS=81; KEYCODE_MENU=82; KEYCODE_NOTIFICATION=83; KEYCODE_SEARCH=84; KEYCODE_MEDIA_PLAY_PAUSE=85; KEYCODE_MEDIA_STOP=86; KEYCODE_MEDIA_NEXT=87; KEYCODE_MEDIA_PREVIOUS=88; KEYCODE_MEDIA_REWIND=89; KEYCODE_MEDIA_FAST_FORWARD=90; KEYCODE_MUTE=91;
問題描述:播放中出現屏保,從屏保回到某頁面後,遙控器失靈。從某頁進入全屏播放,暫停,等小米的屏保出來後將屏保消失,返回到某頁面繼續播放。此時遙控器方向鍵、確定鍵均無響應。Home鍵、電源鍵有響應。菜單鍵有響應。
分析:沒有響應,按鍵被攔截,查了下當時改動的代碼時,對按鍵並未做特殊攔截…. 對比之前的版本,沒有這個問題。確認問題出現在浮層…從log中看,onWindowFocusChanged,在從h5界面/屏保界面回到某頁面,沒有被調用。
說明從window到activity這層,按鍵就被吃掉了。
接著分析:整個BaseActivity,沒有接收到Action_Down事件
Log中打印的“Dropping event due to no window focus”,思路又斷了。
繼續做對比,發現show出浮層時,沒有任何異常,但是只要show時,焦點移動,就能復現按鍵不響應。最後就定位到一個自定義控件上
再接著分析:這個控件1600多行代碼,最初一直在找之前版本改動的地方區別,之前版本主要是做一些對這個控件的定制化,其他的先不考慮,排除法,找和event相關的方法。dispatchKeyEvent沒有任何異常,又沒有思路了,既然是系統級別的傳遞過程中就被吃了,會不會和view相關,因為只要焦點移動,就失靈,焦點移動伴隨著,有一個popupwindow彈出,最終定位在onAttachWindow,好像也沒有做什麼特殊的事,用了一個getHandler,起初我以為是個自己寫的方法,追點進去getHandler一看,是View的
android軟件 可以查詢動車余票 [1].[圖片] 1.jpg 跳至 [1] [2] [3] [4] [5] [2].[圖片] 2.jpg 跳至 [1
一、首先在Application的onCreate中寫:// GeneralAppliction.javapublic static IWXAPI sApi;@Overr
LBS(Location Based Services)直譯的話就是基於地理位置的服務,這裡面至少有兩層意思,第一要能輕易的獲取當前的地理位置,譬如經緯度海拔等,另一個就
Android Service是分為兩種: 本地服務(Local Service): 同一個apk內被調用 遠程服務(Remote Service):被另一個apk調