使用Touch类计算滑动位移:两种坐标计算方案的差异咨询
两种触摸滑动位移实现的核心差异
两种方案的实际计算逻辑
- 方案一:
if(touchPhase == touchPhase.Began) { touchStart = touch.Position; } else if(touchPhase == touchPhase.Ended) { Vector2 length = touch.Position - touchStart; }
逻辑本质是在触摸生命周期的开始阶段,手动缓存手指首次接触屏幕时的有效交互坐标,等触摸结束触发时,用手指离开屏幕时的同基准坐标减去缓存的起始坐标,得到的是手指从按下到抬起全流程的实际滑动总位移。这个计算的两个坐标基准完全统一,结果和业务层感知到的滑动距离完全一致。
- 方案二:
if(touchPhase == touchPhase.Ended) { Vector2 length = touch.RawPosition - touch.Position; }
逻辑本质是直接取触摸结束瞬间,原始输入坐标和修正后交互坐标的差值,从设计上就没有建立滑动起点的参照,计算结果根本不是滑动位移。
关于RawPosition的认知误区
开发者对官方文档描述的“RawPosition在触摸拖动过程中不会发生变化”普遍存在理解偏差:
这段描述的实际含义是:RawPosition是触摸驱动上报的未经处理的原始坐标值,它和经过系统级校准、边缘防误触偏移、屏幕适配修正后的Position值之间的差值是固定的,不会随拖动过程变化——而不是说RawPosition本身从手指按下到拖动的全程,都会保持手指按下瞬间的坐标值不变。
也就是说,拖动过程中RawPosition和Position都会跟着手指的移动同步变化,只是两者的差值永远等于系统侧的固定修正量。那RawPosition - Position算出来的,永远是这个固定的系统修正值,和实际滑动了多长、往哪个方向滑完全没有关系,根本达不到获取滑动长度的需求。
举个具象的例子:如果系统对边缘触点的固定修正量是X轴方向向内偏移10像素、Y轴方向向内偏移5像素,那不管从屏幕左下角滑到右上角,还是原地不动,这个差值算出来永远是(10,5),和滑动距离没有任何关联。
总结两者的本质区别
- 方案一:以手动缓存的触摸起始点为参照,计算全流程的相对位移,是真正符合滑动长度获取需求的实现逻辑
- 方案二:取同一时刻两个坐标值的固定差值,没有滑动起点参照,本质是计算系统坐标修正的补偿值,完全无法实现滑动长度统计的需求
内容的提问来源于stack exchange,提问作者Astigiano
相关产品推荐
相关产品推荐

