android 焦点调试经验及技巧整理

本文详细介绍了Android系统中的焦点调试,包括焦点移动规则、常用接口和应用场景。讲解了焦点如何在不同控件间转移,如何通过代码和XML属性定制焦点行为。还分享了在RecyclerView等列表场景中的焦点处理技巧,以及焦点调试经验,如防止焦点丢失和边界处理。
摘要由CSDN通过智能技术生成


一、概述
1.无论在任何界面都只会有一个view获得焦点,焦点调试一般是用在tv类的设备上操作比较多,一般都是遥控器操作
2.焦点移动规则介绍
1).一般焦点的规则是最开始界面初始化的时候是会去遍历view容器里面哪些view有焦点属性
2).如果有控件有焦点属性的话,就会根据从左右到,从上到下的规则去寻找焦点属性的控件,同一行控件,左边的控件优先获得焦点,同一列控件,上面的控件优先获得焦点,
3).如果按了上下左右操作时,控件的查找规则也类似,当down按下时会去周围查找具有焦点属性的控件,如果没找到就下一个有焦点属性的控件的话就还是自己拿焦点(recycleview快速移动时除外,后面会介绍),
4).当找到控件时,就会再up的时候在那个view获得焦点,如果此时在down的时候强制让某个view请求焦点(requestFocus(),并return true)的话,就可以修改系统原生的焦点查找规则,从而达到客制化焦点移动的效果,如果down的时候不让某个view强制获得了焦点,但是此时没有return true的话,则焦点还是会按系统原始的规则去查找焦点控件
3.有些控件如Butoon等是默认就有焦点属性,一般的Relativelayout等布局以及Imageview等控件是没有焦点属性的
二、常用接口介绍
1.代码类
view.setFocusable(true);//设置控件可以获得焦点属性
view.setFocusableInTouchMode(true);//设置控件可以获得焦点触摸属性
view.isFocusable();//判断控件是否能获得焦点
view.hasFocus();//判断控件是否有焦点
view.requestFocus();//控件强制请求焦点
2.xml属性类
android:focusable="true"
android:focusableInTouchMode="true"
android:nextFocusDown="@+id/view_id" 定义控件上下左右操作后哪个控件获得焦点
android:descendantFocusability="xxx"
xxx的取值有3个:beforeDescendants、afterDescendants、blocksDescendants(一般是listview和gridview中用的多点,recycleview不需要)
beforeDescendants:父控件会优先其子类控件而获取到焦点;
afterDescendants:父控件只有当其子类控件不需要获取焦点时才获取焦点
blocksDescendants:父控件会覆盖子类控件而直接获得焦点;
3.focusableInTouchMode如果有触摸操作时,控件如果开始没焦点,第一时间是会先获得焦点,而不是执行点击操作,当控件获得焦点后才会执行点击操作
三、焦点常见应用场景
1.正常情况下view的效果有3种,一种是选中,一种是上焦点,一种是常态,常见的状态是上焦点时view放大,有个方框,没焦点的时候view缩小无方框,有的还需要修改文本的颜色等效果,基本原理都是通过view的onFocusChange去实现的,view有焦点时hasfocus为true,无焦点返回false
@Override
public void onBindViewHolder(final MyViewHolder holder,final int position) {
holder.getBinding().rlMovieDetailRvItem.setOnFocusChangeListener(new View.OnFocusChangeListener() {
    @Override
    public void onFocusChange(View v, boolean hasFocus) {
        if(hasFocus){
            Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.view_scale_big);//放大
            holder.getBinding().ivActionExplanation.startAnimation(animation); 
            holder.getBinding().rlMovieDetailRvItem.setBackgroundResource                                           (R.drawable.playcontrol_moviedetail_item_bg_yellow_focus);
            //有的时候还需要修改字体的颜色,原理一样
        }else{
            Animation animation = AnimationUtils.loadAnimation(mContext, R.anim.view_scale_small);//缩小
            holder.getBinding().ivActionExplanation.startAnimation(animation);
            holder.getBinding().rlMovieDetailRvItem.setBackgroundResource                                                             (R.drawable.playcontrol_moviedetail_item_bg_no_focus);
        }
    }
});
app\src\main\res\anim\view_scale_small.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true">
    <scale
        android:duration="100"
        android:fromXScale="1.07"
        android:fromYScale="1.07"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.0"
        android:toYScale="1.0" />
</set>
app\src\main\res\anim\view_scale_big.xml
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android"
    android:fillAfter="true"
    android:fillEnabled="true">
    <scale
        android:duration="100"
        android:fromXScale="1.0"
        android:fromYScale="1.0"
        android:interpolator="@android:anim/linear_interpolator"
        android:pivotX="50%"
        android:pivotY="50%"
        android:toXScale="1.07"
        android:toYScale="1.07" />
</set>
2.显示内容较多时的列表显示场景
根据个人经验俩说焦点界面里面使用的最多并且也建议用的列表类的view就是recycleview,因为listview和gridview使用的时候可能会有很多坑或者使用不方便的情况,比如需要设置子容器优先获得焦点,去掉listview/gridview本身的选中效果等
3.焦点调节中tag的使用:
原理就是将view通过tag绑定一个属性值,这个属性值可以是int,也可以是String等其他对象,然后可以在其他地方通过这个view的id去获得其tag的属性,常见的就是从recycleview的列表项中通过得到itemview然后得到itemview的位置,开始是在onBindViewHolder时通过itemview绑定position,之后可以再在activity或view的dispatchKeyEvent中通过getCurrentFocus()获得当前获得焦点的view

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值