华为面试技巧和注意事项,自定义PhotoView事件分发项目实战(3),高级安卓开发技术

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() ) | |

注意:

  1. pin 全称是 pointerIndex,表示第几个手指,此处为了节省空间使用了缩写。

  2. 历史数据只有 ACTION_MOVE 事件。

  3. 历史数据单点触控和多点触控均可以用。

下面是官方文档给出的一个简单使用示例:

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) | 获取历史事件发生的时间。 |

  1. pos 表示历史数据中的第几个数据。( pos < getHistorySize() )
  1. 返回值类型为 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次事件中的压力大小 |

  1. pin 全称是 pointerIndex,表示第几个手指。(pin < getPointerCount() )
  1. 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移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!

由于文件比较大,这里只是将部分目录大纲截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频,并且后续会持续更新

如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
img

学习福利

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

其实Android开发的知识点就那么多,面试问来问去还是那么点东西。所以面试没有其他的诀窍,只看你对这些知识点准备的充分程度。so,出去面试时先看看自己复习到了哪个阶段就好。

虽然 Android 没有前几年火热了,已经过去了会四大组件就能找到高薪职位的时代了。这只能说明 Android 中级以下的岗位饱和了,现在高级工程师还是比较缺少的,很多高级职位给的薪资真的特别高(钱多也不一定能找到合适的),所以努力让自己成为高级工程师才是最重要的。

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

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

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

本文已被CODING开源项目:《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、安卓逆向、云计算

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值