最后
下面是有几位Android行业大佬对应上方技术点整理的一些进阶资料。希望能够帮助到大家提升技术
高级UI,自定义View
UI这块知识是现今使用者最多的。当年火爆一时的Android入门培训,学会这小块知识就能随便找到不错的工作了。
不过很显然现在远远不够了,拒绝无休止的CV,亲自去项目实战,读源码,研究原理吧!
网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。
一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
hasMove = true
if (downX == 0f && downY == 0f) {
downX = event.x
downX = event.y
hasMove = false
}
// 获取滑动的最小距离,因为如果小于这个距离可能是误操作
val touchSlop = ViewConfiguration.get(context).scaledTouchSlop
// 计算水平和垂直的移动距离。因为移动距离有负数的,所以要用绝对值
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 做具体的滑动控件的工作
## 最后
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
当然我也为你们整理好了百度、阿里、腾讯、字节跳动等等互联网超级大厂的历年面试真题集锦。这也是我这些年来养成的习惯,一定要学会把好的东西,归纳整理,然后系统的消化吸收,这样才能极大的提高学习效率和成长进阶。碎片、零散化的东西,我觉得最没有价值的。就好比你给我一张扑克牌,我只会觉得它是一张废纸,但如果你给我一副扑克牌,它便有了它的价值。这和我们收集资料就要收集那些系统化的,是一个道理。
![](https://img-blog.csdnimg.cn/img_convert/bb11c57f087cf9c21a9dd53dc4c27c50.webp?x-oss-process=image/format,png)
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
**网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。**
**[需要这份系统化学习资料的朋友,可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**
可以戳这里获取](https://bbs.csdn.net/topics/618156601)**
**一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!**