break;
}
PointId
虽然前面刚刚说了一个 actionIndex,可以使用 getActionIndex() 获得,但通过 actionIndex 字面意思知道,这个只表示事件的序号,而且根据其说明文档解释,这个 ActionIndex 只有在手指按下(down)和抬起(up)时是有用的,在移动(move)时是没有用的,事件追踪非常重要的一环就是移动(move),然而它却没卵用,这也太不实在了 ( ̄Д ̄)ノ
郑重声明:追踪事件流,请认准 PointId,这是唯一官方指定标准,不要相信 ActionIndex 那个小婊砸。
PointId 在手指按下时产生,手指抬起或者事件被取消后消失,是一个事件流程中唯一不变的标识,可以在手指按下时 通过 getPointerId(int pointerIndex)
获得。 (参数中的 pointerIndex 就是 actionIndex)
关于事件流的追踪等问题在讲解多点触控时再详细讲解。
由于我们的设备非常灵敏,手指稍微移动一下就会产生一个移动事件,所以移动事件会产生的特别频繁,为了提高效率,系统会将近期的多个移动事件(move)按照事件发生的顺序进行排序打包放在同一个 MotionEvent 中,与之对应的产生了以下方法:
| 事件 | 简介 |
| — | — |
| getHistorySize() | 获取历史事件集合大小 |
| getHistoricalX(int pos) | 获取第pos个历史事件x坐标 |
| (pos < getHistorySize()) | |
| getHistoricalY(int pos) | 获取第pos个历史事件y坐标 |
| (pos < getHistorySize()) | |
| getHistoricalX (int pin, int pos) | 获取第pin个手指的第pos个历史事件x坐标 |
| (pin < getPointerCount(), pos < getHistorySize() ) | |
| getHistoricalY (int pin, int pos) | 获取第pin个手指的第pos个历史事件y坐标 |
| (pin < getPointerCount(), pos < getHistorySize() ) | |
注意:
-
pin 全称是 pointerIndex,表示第几个手指,此处为了节省空间使用了缩写。
-
历史数据只有 ACTION_MOVE 事件。
-
历史数据单点触控和多点触控均可以用。
下面是官方文档给出的一个简单使用示例:
void printSamples(MotionEvent ev) {
final int historySize = ev.getHistorySize();
final int pointerCount = ev.getPointerCount();
for (int h = 0; h < historySize; h++) {
System.out.printf(“At time %d:”, ev.getHistoricalEventTime(h));
for (int p = 0; p < pointerCount; p++) {
System.out.printf(" pointer %d: (%f,%f)",
ev.getPointerId§, ev.getHistoricalX(p, h), ev.getHistoricalY(p, h));
}
}
System.out.printf(“At time %d:”, ev.getEventTime());
for (int p = 0; p < pointerCount; p++) {
System.out.printf(" pointer %d: (%f,%f)",
ev.getPointerId§, ev.getX§, ev.getY§);
}
}
获取事件发生的时间。
| 方法 | 简介 |
| — | — |
| getDownTime() | 获取手指按下时的时间。 |
| getEventTime() | 获取当前事件发生的时间。 |
| getHistoricalEventTime(int pos) | 获取历史事件发生的时间。 |
- pos 表示历史数据中的第几个数据。( pos < getHistorySize() )
- 返回值类型为 long,单位是毫秒。
MotionEvent支持获取某些输入设备(手指或触控笔)的与屏幕的接触面积和压力大小,主要有以下方法:
描述中使用了手指,触控笔也是一样的。
| 方法 | 简介 |
| — | — |
| getSize () | 获取第1个手指与屏幕接触面积的大小 |
| getSize (int pin) | 获取第pin个手指与屏幕接触面积的大小 |
| getHistoricalSize (int pos) | 获取历史数据中第1个手指在第pos次事件中的接触面积 |
| getHistoricalSize (int pin, int pos) | 获取历史数据中第pin个手指在第pos次事件中的接触面积 |
| getPressure () | 获取第一个手指的压力大小 |
| getPressure (int pin) | 获取第pin个手指的压力大小 |
| getHistoricalPressure (int pos) | 获取历史数据中第1个手指在第pos次事件中的压力大小 |
| getHistoricalPressure (int pin, int pos) | 获取历史数据中第pin个手指在第pos次事件中的压力大小 |
- pin 全称是 pointerIndex,表示第几个手指。(pin < getPointerCount() )
- pos 表示历史数据中的第几个数据。( pos < getHistorySize() )
注意:
1、获取接触面积大小和获取压力大小是需要硬件支持的。
2、非常不幸的是大部分设备所使用的电容屏不支持压力检测,但能够大致检测出接触面积。
3、大部分设备的 getPressure()
是使用接触面积来模拟的。
4、由于某些未知的原因(可能系统版本和硬件问题),某些设备不支持该方法。
我用不同的设备对这两个方法进行了测试,然而不同设备测试出来的结果不相同,之后经过我多方查证,发现是系统问题,有的设备上只有 getSize()
能用,有的设备上只有 getPressure()
能用,而有的则两个都不能用。
由于获取接触面积和获取压力大小受系统和硬件影响,使用的时候一定要进行数据检测,以防因为设备问题而导致程序出错。
由于触控笔事件和手指事件处理流程大致相同,所以就不讲解了,这里讲解一下与鼠标相关的几个事件:
| 事件 | 简介 |
| — | — |
| ACTION_HOVER_ENTER | 指针移入到窗口或者View区域,但没有按下。 |
| ACTION_HOVER_MOVE | 指针在窗口或者View区域移动,但没有按下。 |
| ACTION_HOVER_EXIT | 指针移出到窗口或者View区域,但没有按下。 |
| ACTION_SCROLL | 滚轮滚动,可以触发水平滚动(AXIS_HSCROLL)或者垂直滚动(AXIS_VSCROLL) |
注意:
1、这些事件类型是 安卓4.0 (API 14) 才添加的。
2、使用 getActionMasked()
获得这些事件类型。
3、这些事件不会传递到onTouchEvent(MotionEvent) 而是传递到 onGenericMotionEvent(MotionEvent)
输入设备类型判断也是安卓4.0 (API 14) 才添加的,主要包括以下几种设备:
| 设备类型 | 简介 |
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
学习福利
【Android 详细知识点思维脑图(技能树)】
其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。
虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。
这里附上上述的面试题相关的几十套字节跳动,京东,小米,腾讯、头条、阿里、美团等公司19年的面试题。把技术点整理成了视频和PDF(实际上比预期多花了不少精力),包含知识脉络 + 诸多细节。
由于篇幅有限,这里以图片的形式给大家展示一小部分。
网上学习 Android的资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。希望这份系统化的技术体系对大家有一个方向参考。
一个人可以走的很快,但一群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算
群人才能走的更远。如果你从事以下工作或对以下感兴趣,欢迎戳这里加入程序员的圈子,让我们一起学习成长!**](https://bbs.youkuaiyun.com/forums/4304bb5a486d4c3ab8389e65ecb71ac0)
AI人工智能、Android移动开发、AIGC大模型、C C#、Go语言、Java、Linux运维、云计算、MySQL、PMP、网络安全、Python爬虫、UE5、UI设计、Unity3D、Web前端开发、产品经理、车载开发、大数据、鸿蒙、计算机网络、嵌入式物联网、软件测试、数据结构与算法、音视频开发、Flutter、IOS开发、PHP开发、.NET、安卓逆向、云计算