1. 程式人生 > >Android 盒子開發,TV開發,經驗總結NO.1

Android 盒子開發,TV開發,經驗總結NO.1

Android  TV app開發與一般Android開發最大的區別在於焦點控制 , 使用者在使用Android TV裝置主要是通過遙控器操作app 機頂盒TV應用不同於手機應用,因為多數是沒有觸控式螢幕的,只能靠遙控器,所以要保持一個焦點的位置,讓使用者知道當前操作作用的物件. 然而一些app,依據系統對focus的判斷, 會出現的狀況: 上下導航時,不是想要的結果. 邊緣移動時,會出現焦點丟失的狀況. 有時想直接定位到某個位置上 android提供了一些焦點相關的屬性,在現有的框架層下通過設定View的屬性來獲得焦點
  android:focusable :設定一個控制元件能否獲得焦點(在TV開發中,這個必加的一個,控制元件預設是沒有focus) 在焦點控制時,Android會有自己的焦點移動軌跡,當我面不想按照系統的軌跡來移動焦點的時候需要用到下面的四個選項來指定焦點:
       android:nextFocusDown:當按下鍵時定義下一個獲得焦點的控制元件
       android:nextFocusUp:當按上鍵時定義下一個獲得焦點的控制元件
       android:nextFocusLeft:當按左鍵時定義下一個獲得焦點的控制元件
       android:nextFocusRight:當按右鍵時定義下一個獲得焦點的控制元件
requestFocus <requestFocus/> :強制設定一個焦點到指定的view或它的一個子類,前提是android:focusable為true能夠獲得焦點 android:background :設定背景的 上面的基礎理論已經有了,下面講下如何實際 處理焦點問題操作: 一。 採用Android自帶方法從而直接控制焦點上下左右。 但是這種方法的前提是必須知道每個view的id,常用場景:在XML中一堆button,大小不一,使用系統的自控制焦點,可能不是我們想要的上下左右,無法很舒服讓焦點的到達其位置,因此使用
android:nextFocusDown="@id/view_id"
android:nextFocusUp="@id/view_id"
android:nextFocusLeft="@id/view_id"
android:nextFocusRight="@id/view_id"
按上下左右鍵到達:ID為view_id的view,此view必須是  android:focusable ="true" 因此在java 中要通過view.setId(…)指定view的特定ID,然後通過view.setNextLeftView(…)等四個方法控制該view的上下左右移動後所到達的view。 然而這種方法只適用於前提就設定好ID的場景,不適合動態佈局的場景 這是更改焦點運動路線,實際焦點到了哪要讓使用者研究能看到,這個時候我們就需要監聽焦點的問題,及時修改背景顏色, 必須對每個View 設定焦點捕獲實際( setOnFocusChangeListener ),在該監聽事件中處理:
        View.setOnFocusChangeListener(){   
              public void onFocus(boolean Focus){   
                   if( Focus ){  
                    View.setBackground(R.color.green); // View  獲焦時,View 改變獲取焦點背景, View也改變失去焦點背景   
                         
                    } else{  
                    View.setBackground(R.color.while); //  View 獲焦時, View 改變失去焦點背景 , View也改變獲取焦點背景
                                
                    } 
              }
除了監聽view的 setOnFocusChangeListener,也可監聽遙控器上下左右按鍵,如:
            public void OnKeyDown(int keyCode, KeyEvent keyEvent){  
                    if( keyEvent.KEYCODE_DROP_UP== keyCode ){  //如果按下的是上鍵  
                            mImgBtnArray1[ThirdIndx ].requestFocus;  
                     }  
                    if( keyEvent.KEYCODE_DROP_DOWN == keyCode ){  //如果按下的是下鍵  
                              mImgBtnArray3[ ThirdIndx ].requestFocus;  
                     }  
                    if( keyEvent.KEYCODE_DROP_LEFT == keyCode ){  //如果按下的是左鍵  
                              mImgBtnArray1[ ThirdIndx-1 ].requestFocus;  
                     }  
                    if( keyEvent.KEYCODE_DROP_RIGHT == keyCode ){  //如果按下的是右鍵  
                              mImgBtnArray1[ ThirdIndx+1 ].requestFocus;   
                     }  
              }