Android事件分发流程分析测试(2)

2016-12-23 15:33 阅读 5,422 次 评论 0 条

摘要:

距离写《Android事件分发流程分析测试(1)》这篇文章已经有一段时间了,发布后收到的反馈也挺好。紧接着上一篇,分析滑动水平滑动距离和垂直滑动距离的关系,结合例子测试,深入理解事件分发的流程,TeachCourse这篇文章分析手势触摸屏幕到滑动屏幕之间角度的大小,识别滑动的方向,然后使用《Android事件分发流程分析证明(1)》和《Android事件分发流程分析证明(2)》得出的结论,执行事件的拦截,解决手势冲突

解决手势冲突的关键是深入理解onInterceptTouchEvent、dispatchTouchEvent、onTouchEvent方法返回值的含义,以及使用方法requestDisallowInterceptTouchEvent的目的。运行Demo多测试几次,然后记录总结,事件分发也就那么回事,手势冲突也是那么回事,没用想象中那么难。
1219-2315-arc

一、如何计算滑动手势的角度?

手指触摸屏幕到手指滑动,以触摸屏幕时的点为坐标原点,连接触摸屏幕的点和滑动停止的点(手指还没离开屏幕),形成一条直线,结合坐标轴的关系,构成一个直角三角形,直角三角形只需要知道其中两边的大小,就可以可计算出另外一边和另外两个角度大小。

触摸屏幕在ACTION_DOWN获得第一个坐标点,滑动屏幕获得第二坐标点,手势滑动的距离即两个坐标点的X轴和Y轴的绝对值。不管手势是向下滑动,还是向左滑动,最终都会形成一个滑动的距离。如果手势水平滑动Y轴的滑动距离为0,同时如果垂直滑动X轴的滑动距离也为0。

知道两条直角边,计算正切值;反之,知道正切值,计算反正切值即弧度,知道弧度值计算角度,需要使用到Math工具类。比如,一个等边直角三角形,正切值等于1,另外两个角度分别为45°、45°,计算过程如下

  1.    /** 
  2.     * 根据反正切计算弧度,再由弧度计算角度 
  3.     * 
  4.     * @param deltaX 
  5.     * @param deltaY 
  6.     * @return 
  7.     */  
  8.    private double calculateDegrees(double deltaX, double deltaY) {  
  9.        deltaX = Math.abs(deltaX);  
  10.        deltaY = Math.abs(deltaY);  
  11. /** 
  12.  *返回反正切的弧度 
  13.  */  
  14.        double arc=Math.atan(deltaY/deltaX);  
  15. /** 
  16.  *由弧度值,计算角度值 
  17.  */  
  18.        return Math.toDegrees(arc);  
  19.    }  
  20.     
  21.   private void initView() {  
  22.        TextView tv=new TextView(this);  
  23.        tv.setText(calculateDegrees(1.0,1.0)+"");  
  24.        setContentView(tv);  
  25.    }  

二、滑动角度手势冲突运用

屏幕上滑动手势构成的角度在0°到180°之间,大于45°而小于135°,deltaY>deltaX;反之,deltaX>deltaY。相比TeachCourse在上一篇《Android事件分发流程测试运用》文章介绍的第一种判断水平或垂直滑动的方式,你会发觉计算手势角度的好处,即使deltaY>deltaX,依然可以识别为水平方向滑动;同时,即使deltaX>deltaY,依然可以识别为垂直方向滑动。

你可能感兴趣的文章

来源:TeachCourse每周一次,深入学习Android教程,关注(QQ158#9359$239或公众号TeachCourse)
转载请注明出处: https://www.teachcourse.cn/2233.html ,谢谢支持!

资源分享

带www和不带www域名与网站收录量、权重关系 带www和不带www域名与网站收录量
微信支付不成功的几个原因 微信支付不成功的几个原因
对象系列化两种方法Serializable和Parcelable 对象系列化两种方法Serializabl
Android开发之数据存储的四种方式之一:Network存储 Android开发之数据存储的四种方