2024年Android触摸事件部分细节,2024年最新vivo面试难吗 知乎

总结

【Android 详细知识点思维脑图(技能树)】

我个人是做Android开发,已经有十来年了,目前在某创业公司任职CTO兼系统架构师。虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。

由于篇幅有限,这里以图片的形式给大家展示一小部分。

网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。

最后,赠与大家一句话,共勉!

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化学习资料的朋友,可以戳这里获取

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

            // 计算水平和垂直的移动距离。因为移动距离有负数的,所以要用绝对值

            val horizontalMove = abs(event.x - downX)

            val verticalMove = abs(event.y - downY)



            // 如果用户处于滑动状态了,并且水平滑动的距离比垂直的大,则请求父View不要拦截touch事件

            if ((horizontalMove >= touchSlop || verticalMove >= touchSlop)

                    && horizontalMove > verticalMove) {

                parent.requestDisallowInterceptTouchEvent(true)

            }

        }

        MotionEvent.ACTION_UP -> {

            isPressed = false // 系统属性,修改按下状态

            if (!hasMove) {

                performClick()

            }

            hasMove = false



            /* 因为有时候收不到ACTION_DOWN事件,但是能收到移动事件,所以这里

               在抬起时清空一下数据,方便在移动时判断是否有收到ActionDown事件 */

            downX = 0f

            downY = 0f

        }

    }

}



可以看到,在onTouchEvent方法里面,我们调用了一个processEventConflict方法来解决事件突然,后面具体的实现滑动控件的代码就没有写了。有几个关键点需要提一下:



1.  ViewConfiguration.get(context).scaledTouchSlop  

    这是Android本身的方法,用于获取代表滑动的最小距离,这个值可能不同的手机它的取值不一样,像我的一个测试手机运行结果是7像素,也就是说如果你的手指滑动距离不够7像素,则应该认为用户还没处于滑动状态,你不能就开始判断用户是向左还是向右滑了。比如用户是想水平方向滑动的,但是一开始操作不好,最开始滑动的几个像素是垂直的,如果这时你就认为是垂直的,而按垂直处理那就有问题了,因为用户有可能接下来手指会慢慢开始往水平方向走。所以在我的需求中,当用户滑动的距离大于这个最小距离时,我再去比较水平和垂直的滑动距离,如果水平距离大,则我认为用户是希望水平滑动的,则我请求父View不要拦截到事件,这样做为父View的ListView的垂直滑动就不会进行了,即使我们后面进行上下滑动时ListView也不会动了。

    

2.  移动的距离在计算的时候,是有可能产生负数的,比如从左往右滑,或从右往左滑,距离应该取绝对值。

    

3.  单击  

    我们写完代码时,会发现onTouchEvent方法上有个警告,如下:  

    “Custom view MyGroupView overrides onTouchEvent but not performClick”  

    翻译过来就是“MyGroupView这个自定义View覆盖了onTouchEvent但是没有覆盖performClick",这提醒了我,我们在覆盖onTouchEvent方法后,其实这个自定义View的单击事件就没有了,所以我后来做了处理,当收到ACTION\_UP事件时,判断一下用户是否有移动操作,如果没有,则是单击操作,这样的话,我们的自定义View除了可以响应滑动的事件外,也可以响应单击事件。除了单击还有长按事件,这个并不常用,如果需要实现的话可以参考一些Android原生View的实现,如查看View的onTouchEvent方法中是如何实现长按的检测的。  

    这个"Custom view MyGroupView overrides onTouchEvent but not performClick"警告有点看不懂为什么我们覆盖onTouchEvent的时候就要同时覆盖performClick,百度上说的也不明不白,在国外有一篇文章:[https://stackoverflow.com/questions/27462468/custom-view-overrides-ontouchevent-but-not-performclick]( ),这篇文章说的多一点,但是也不是很明白,应该如何覆盖这个performClick,覆盖后里面写什么代码呢没有说,大概了解到这是因为在需要有辅助功能时需要做的,如果我们不想覆盖performClick,则在onTouchEvent上加入一个注解即可,如下:

    

    ```

     	@SuppressLint("ClickableViewAccessibility")

         override fun onTouchEvent(event: MotionEvent): Boolean {

             processEventConflict(event)

             // TODO 做具体的滑动控件的工作

             return super.onTouchEvent(event)

         }

    

    ```

    

    看注解的字符串“ClickableViewAccessibility”也能看出就是因为辅助功能才有的这个警告,什么是“辅助功能”?在设置里面,可以打开辅助功能的,比如一些盲人看不见,它会用手去摸屏幕,会发出语音,这些就是辅助功能,所以大多数情况下我们是不关注这个点的,所以直接加个注解忽略来去除此警告即可。

    



 



  


# 结语

*   现在随着短视频,抖音,快手的流行NDK模块开发也显得越发重要,需要这块人才的企业也越来越多,随之学习这块的人也变多了,音视频的开发,往往是比较难的,而这个比较难的技术就是NDK里面的技术。
*   音视频/高清大图片/人工智能/直播/抖音等等这年与用户最紧密,与我们生活最相关的技术一直都在寻找最终的技术落地平台,以前是windows系统,而现在则是移动系统了,移动系统中又是以Android占比绝大部分为前提,所以AndroidNDK技术已经是我们必备技能了。
*   要学习好NDK,其中的关于C/C++,jni,Linux基础都是需要学习的,除此之外,音视频的编解码技术,流媒体协议,ffmpeg这些都是音视频开发必备技能,而且
*   OpenCV/OpenGl/这些又是图像处理必备知识,下面这些我都是当年自己搜集的资料和做的一些图,因为当年我就感觉视频这块会是一个大的趋势。所以提前做了一些准备。现在拿出来分享给大家。

![](https://img-blog.csdnimg.cn/img_convert/1bca25cca9fd8ffb77c38b93878036e4.webp?x-oss-process=image/format,png)

![](https://img-blog.csdnimg.cn/img_convert/29c5d2f401c1f6caf42575265f36ff0c.webp?x-oss-process=image/format,png)



**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**

**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**

**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值