Android TV 智慧電視/盒子 APP 開發焦點控制 兩種方法例項

Chitty_Tina發表於2016-07-13


感謝分享 http://www.7po.com/thread-564068-1-1.html


第一種方法:

採用Android自帶的直接控制焦點上下左右的方法。這種方法的前提是必須知道每個view的id,因此在進行佈局時有必須要通過view.setId(…)指定view的特定ID,然後通過view.setNextLeftView(…)等四個方法控制該view的上下左右移動後所到達的view。

第二種方法:

在一些比較複雜的Layout中,特別是涉及到在View的焦點變化的過程中還要控制view的背景以及字型顏色變化等。

比如:在有多個Layout(假設有Layout1, Layout2, Layout3,每個Layout中都有若干個ImageButton),

當你從Layout1中的某個ImageButton 1.1中移動Layout2中ImageButton 2.1,此時ImageButton 1.1要標識為被選中,但是失去焦點,此時ImageButton 2.1是選中並且獲取焦點,再從ImageButton 2.1移到ImageButton 3.1的過程中也是這種情況。

對於這樣一種情況,你必須對每個ImageButton 設定焦點捕獲實際(setOnFocusChangeListener),在該監聽事件中處理,

(注:下面程式碼即興寫的,大概就是這個意思 –^_^– )


  1. <code class="hljs java">ImageButton.setOnFocusChangeListener(){ 
  2.           public void onFocus(boolean Focus){ 7 }8 a7 c5 d  Z# Q) \  M. s1 s
  3.                    if( Focus ){
  4.                     // ImageButton 2.1 獲焦時, ImageButton 2.1 改變獲取焦點背景, ImageButton 1.1也改變失去焦點背景 / \$ l0 |0 j% ]8 c. T7 h
  5.                      } else{
  6.                      //  ImageButton 2.1 獲焦時,  ImageButton 2.1 改變失去焦點背景 ,  ImageButton 3.1也改變獲取焦點背景  3 H* l9 C+ n  y( c- Q& L$ e/ c8 o
  7.          }# r7 ^9 W1 ]; L( h& W7 E( u& Z

  8.               }% x1 S2 E4 W. e" J* ]4 \  `
  9.   }</code>
複製程式碼

還有就是當你當前焦點移動到ImageButton 3.1上時,你有時需要知道此時Layout1、Layout2上是哪個ImageButton 被選中,因此你還必須設定三個ImageButton 變數(標識選中哪個佈局中的那個ImageButton 物件),和三個int變數(標識選中哪個佈局中的第幾個)。

通過這些標識,你就可以很方便的瞭解到那個聚焦和哪個失去焦點了。

對於進行上下左右的控制,此時就要在OnKeyDown事件中進行捕獲處理了。由於事先已經知道是哪個Layout中的哪ImageButton被選中了,而此時你進行上下左右操作是在你被選中的View上進行操作的,因此在OnKeyDown中你只需先判斷是哪個View被選中,然後根據按鍵事件來移動View(通過之前設定的int標識進行移動)

(注:由於是即興寫的,可能部分程式碼有錯誤,這裡只是描述這個意思,–^_^–)

假設Layout1中被選中的ImageButton為mFirstImgBtn, 序號為mFirstIndx;

Layout3中被選中的ImageButton為mThirdImgBtn, 序號為mThirdIndx;

每個Layout裡面的ImageButton均在一個陣列中,
假設分別為:ImageButton mImgBtnArray1[], mImgBtnArray2[], mImgBtnArray3[]

  1. <code class="hljs cs">當前被選中的view為   mSenondImgBtn' |( j: b7 U( w8 S$ k  O+ p

  2.        public void OnKeyDown(int keyCode, KeyEvent event){

  3.                     if( event.KEYCODE_DROP_UP== keyCode ){  //如果按下的是上鍵- i' D' Y0 J1 S. c

  4.                             mImgBtnArray1[ThirdIndx ].requestFocus;- j( T" B" f* S5 l; A2 }

  5.                      }. Y  _( R5 ?9 D

  6.                     if( event.KEYCODE_DROP_DOWN == keyCode ){  //如果按下的是下鍵% |( u! c* ^+ z: ^5 |) O* u5 y

  7.                               mImgBtnArray3[ ThirdIndx ].requestFocus;

  8.                      }

  9.                     if( event.KEYCODE_DROP_LEFT == keyCode ){  //如果按下的是左鍵: E# o& k( N, Z2 ^+ c3 s
  10. 1 d3 p8 @+ h' y, F
  11.                               mImgBtnArray1[ ThirdIndx-1 ].requestFocus;

  12.                      }

  13.                     if( event.KEYCODE_DROP_RIGHT == keyCode ){  //如果按下的是右鍵
  14. 9 N9 S' ?# f( f+ W: g: Z
  15.                                mImgBtnArray1[ ThirdIndx+1 ].requestFocus; + ~* E# u  t$ A* X/ {2 Q0 p, ]' v
  16. # f. W! c6 y5 w$ n; }
  17.                      }. J/ W' R' ]# Q( n

  18.        }</code>8 R& M. W3 ~7 E- y- [
複製程式碼
6 |9 `- i+ p+ D% w; i( C
而具體的獲焦事件處理則在每個View的 OnFocusChangeListener 事件中處理。

相關文章