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;
}
}