因为工作需要,需要捕捉激光笔在投影仪图像中的位置,激光笔在投影中的位置是绝对坐标,鼠标移动事件使用的是相对坐标,如何将得到的位置转化为鼠标相对位移呢?
鼠标光标在android系统内绘制的时候使用的是绝对坐标.因此鼠标移动事件从INPUT层传递到光标绘制环节,需要将事件中的相对位移叠加到绝对坐标值上绘制。这个相对位移传到framework层会通过一定的算法将X轴和
Y轴上的值分别做一定比例的缩放,具体的缩放
算法依据鼠标位移的速度,和加速度来定,因此仅仅简单叠加相对位移结果无法让鼠标和激光笔光标位置保持位置一致,一定会产生偏差。
android中的算法实现:android系统层通过收集鼠标历史相对位移数据、事件产生的时间信息,利用最小二乘法通过矩阵运算做函数拟合,确定函数系数中的移动速度和加速度。
利用速度和加速度的值修改鼠标的位移delta量,再叠加到绝对坐标值中。