Android_TV盒子开发_焦点控制

Android的互联网电视客户端,开发与phone/pad差不多,但是有一个值得注意的地方就是焦点控制的问题。

在TV上做应用开发,由于TV呈现的界面比较大,上面放的View/layout也比较多,用户操作是主要是通过遥控器操作(通常是用遥控器,

如果支持映像触控技术,那么view也要实现类似phone/pad上的触屏操作),因此,在对iew的上下左右移动的控制就要处理好。

        经过这一段时间的开发,总结出两套比较有用的控制焦点的机制。特在此分享。

        第一种方法:采用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),在该监听事件中处理,(注:下面代码即兴写的,大概就是这个意思 --^_^-- )

           ImageButton.setOnFocusChangeListener(){

                       public void onFocus(boolean Focus){

                                   if( Focus ){

                                                 // ImageButton 2.1 获焦时, ImageButton 2.1 改变获取焦点背景, ImageButton 1.1也改变失去焦点背景

                                   } else{

                                                // //  ImageButton 2.1 获焦时,  ImageButton 2.1 改变失去焦点背景 ,  ImageButton 3.1也改变获取焦点背景  

                                    }

                        }

              }

还有就是当你当前焦点移动到ImageButton 3.1上时,你有时需要知道此时Layout1、Layout2上是哪个ImageButton 被选中,因此你还必须设置三个ImageButton  变量(标识选中哪个布局中的那个ImageButton  对象),和三个int变量(标识选中哪个布局中的第几个)。

    通过这些标识,你就可以很方便的了解到那个聚焦和哪个失去焦点了。

    对于进行上下左右的控制,此时就要在OnKeyDown事件中进行捕获处理了。由于事先已经知道是哪个Layout中的哪个ImageButton被选中了,而此时你进行上下左右操作是在你被选中的View上进行操作的,因此在OnKeyDown中你只需先判断是哪个View被选中,然后根据按键事件来移动View(通过之前设置的int标识进行移动)(注:由于是即兴写的,可能部分代码有错误,这里只是描述这个意思,--^_^--)

               假设Layout1中被选中的ImageButton为mFirstImgBtn, 序号为mFirstIndx; 

                      Layout2中被选中的ImageButton为mSenondImgBtn, 序号为mSenondIndx;  

                      Layout3中被选中的ImageButton为mThirdImgBtn, 序号为mThirdIndx; 

                       每个Layout里面的ImageButton均在一个数组中,假设分别为:ImageButton mImgBtnArray1[],  mImgBtnArray2[],    mImgBtnArray3[],  

                  当前被选中的view为   mSenondImgBtn 

       public void OnKeyDown(int keyCode, KeyEvent event){

                    if( event.KEYCODE_DROP_UP== keyCode ){  //如果按下的是上键

                            mImgBtnArray1[ThirdIndx ].requestFocus;

                     }

                    if( event.KEYCODE_DROP_DOWN == keyCode ){  //如果按下的是下键

                              mImgBtnArray3[ ThirdIndx ].requestFocus; 

                     } 

                    if( event.KEYCODE_DROP_LEFT == keyCode ){  //如果按下的是左键

                              mImgBtnArray1[ ThirdIndx-1 ].requestFocus; 

                     } 

                    if( event.KEYCODE_DROP_RIGHT == keyCode ){  //如果按下的是右键

                               mImgBtnArray1[ ThirdIndx+1 ].requestFocus;  

                     } 

       }

  而具体的获焦事件处理则在每个View的 OnFocusChangeListener 事件中处理。


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值