Android TV 开发过程及焦点问题处理
开发步骤
- 先创建控件获取到焦点时背景的变化情况,在drawable下创建3个xml文件
menu_bg.xml
<?xml version="1.0" encoding="utf-8"?>
<selector xmlns:android="http://schemas.android.com/apk/res/android">
<item android:drawable="@drawable/menu_focused" android:state_focused="true" />
<item android:drawable="@drawable/menu_normal" />
</selector>
menu_focused.xml
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<padding
android:bottom="3dp"
android:left="3dp"
android:right="3dp"
android:top="3dp" />
<stroke
android:width="2dp"
android:color="@color/light_blue" />
<corners android:radius="8dp" />
</shape>
menu_normal.xlm
<?xml version="1.0" encoding="utf-8"?>
<shape xmlns:android="http://schemas.android.com/apk/res/android"
android:shape="rectangle">
<padding
android:bottom="2dp"
android:left="2dp"
android:right="2dp"
android:top="2dp"/>
<stroke
android:width="2dp"
android:color="@color/tou_ming"/>
</shape>
-
在某个控件中设置android:background = “@drawable/menu_bg”
注意:如果焦点控件背景变化有被遮挡,最好把外层变化的控件改成用RelativeLayout处理,且最外层的控件长宽必须是大于当前焦点控件的或者直接用march_parent(自己的解决方案,亲测有效) -
引入第三方框架 implementation project(’:leanback’)
github上的地址 https://github.com/DukerSunny/V14Leanback.git -
在Java文件里面继承 View.OnFocusChangeListener
对控件做监听的和焦点获取处理
relativeLayout.setFocusableInTouchMode(true);
relativeLayout.setOnFocusChangeListener(this);
在回调方法onFocusChange中对获取到的焦点进行控件变化
if (hasFocus){
AnimUtil.scaleAnim(v, 1.0f, 1.1f, 300);
}else {
AnimUtil.scaleAnim(v, 1.0f, 1.0f, 300);
}
** 如果是列表里面控件要获取焦点,可以在设置item的根布局的属性android:descendantFocusability=“beforeDescendants”
android:descendantFocusability属性共有三个取值,分别为
beforeDescendants:viewgroup会优先其子类控件而获取到焦点
afterDescendants:viewgroup 只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:viewgroup 会覆盖子类控件而直接获得焦点 **
o了,有问题欢迎留言探讨