摘要:
距离写《Android事件分发流程分析测试(1)》这篇文章已经有一段时间了,发布后收到的反馈也挺好。紧接着上一篇,分析滑动水平滑动距离和垂直滑动距离的关系,结合例子测试,深入理解事件分发的流程,TeachCourse这篇文章分析手势触摸屏幕到滑动屏幕之间角度的大小,识别滑动的方向,然后使用《Android事件分发流程分析证明(1)》和《Android事件分发流程分析证明(2)》得出的结论,执行事件的拦截,解决手势冲突。
解决手势冲突的关键是深入理解onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent方法返回值的含义,以及使用方法requestDisallowInterceptTouchEvent的目的。运行Demo多测试几次,然后记录总结,事件分发也就那么回事,手势冲突也是那么回事,没用想象中那么难。
一、如何计算滑动手势的角度?
手指触摸屏幕到手指滑动,以触摸屏幕时的点为坐标原点,连接触摸屏幕的点和滑动停止的点(手指还没离开屏幕),形成一条直线,结合坐标轴的关系,构成一个直角三角形,直角三角形只需要知道其中两边的大小,就可以可计算出另外一边和另外两个角度大小。
触摸屏幕在ACTION_DOWN获得第一个坐标点,滑动屏幕获得第二坐标点,手势滑动的距离即两个坐标点的X轴和Y轴的绝对值。不管手势是向下滑动,还是向左滑动,最终都会形成一个滑动的距离。如果手势水平滑动Y轴的滑动距离为0,同时如果垂直滑动X轴的滑动距离也为0。
知道两条直角边,计算正切值;反之,知道正切值,计算反正切值即弧度,知道弧度值计算角度,需要使用到Math工具类。比如,一个等边直角三角形,正切值等于1,另外两个角度分别为45°、45°,计算过程如下
- /**
- * 根据反正切计算弧度,再由弧度计算角度
- *
- * @param deltaX
- * @param deltaY
- * @return
- */
- private double calculateDegrees(double deltaX, double deltaY) {
- deltaX = Math.abs(deltaX);
- deltaY = Math.abs(deltaY);
- /**
- *返回反正切的弧度
- */
- double arc=Math.atan(deltaY/deltaX);
- /**
- *由弧度值,计算角度值
- */
- return Math.toDegrees(arc);
- }
- private void initView() {
- TextView tv=new TextView(this);
- tv.setText(calculateDegrees(1.0,1.0)+"");
- setContentView(tv);
- }
二、滑动角度手势冲突运用
屏幕上滑动手势构成的角度在0°到180°之间,大于45°而小于135°,deltaY>deltaX;反之,deltaX>deltaY。相比TeachCourse在上一篇《Android事件分发流程测试运用》文章介绍的第一种判断水平或垂直滑动的方式,你会发觉计算手势角度的好处,即使deltaY>deltaX,依然可以识别为水平方向滑动;同时,即使deltaX>deltaY,依然可以识别为垂直方向滑动。
你可能感兴趣的文章
转载请注明出处: https://www.teachcourse.cn/2233.html ,谢谢支持!