安卓整体梳理二(View的事件体系)

安卓中的View是所有控件的基类,ViewGroup也是继承于View

一、View的位置参数:

1、top,left,right,bottom,是View左上角和右下角的坐标,是相对于父容器的相对坐标,可以通过View.getLeft()...得到。

      这几个坐标是表示View的原始位置,不会因为发生偏移而变化

2、x,y,是View左上角的坐标 ,是View左上角的坐标,也是相对于父容器的相对坐标,可以通过View.getX()...得到。

     这个坐标是表示View的当前位置,会因为发生偏移而变化

3,如果View在原来的位置上发生了偏移,那么可以用tanslationX,translationY来描述偏移量

     x=left+translationX ,  y=top+tanslationY;

二、MotionEvent

当触摸屏幕产生点击事件之后,会产生几种典型的事件:ACTION_DOWN,ACTION_MOVE,ACTION_UP,我们可以通过MotionEvent获取到点击事件的坐标,其中getX,getY返回的是相对于当前View左上角的坐标,getRowX,getRowY返回的是相对于手机屏幕左上角的x和y坐标,一般在自定义View的onTouchEvent里获取MotionEvent。

三、VelocityTraker,GestureDetector,和Scroll

1、VelocityTraker用于速度追踪,计算当前的滑动速度,只需将MotionEvent传入,然后设置统计的时长(ms),就能算出设定时长里的滑动距离从而计算速度。

2、GestureDetector用户辅助检测用户手势(单击,滑动,长按,双击等),传入MotionEvent作为参数,就可以辅助检测手势, 当然也可以在onTouchEvent里自己判断MotionEvent。

四、View的滑动

  1. 使用scrollTo/scrollBy,这种方式只能改变View的内容的位置,不能改变View的位置,通过这种方式滑动时,view的mScrollX和mScrollY的值发生变化
  2. 使用动画,分为View动画(android.view.animation包)和属性动画(android.animation包),其中View动画只能操作View的影像,并不能真正改变View的位置参数,属性动画则没有这个问题,优点是能实现复杂的效果   (注意:这里的改变位置参数指的是改变View的xy坐标,View的Top,Left等参数保持不变)
  3. 改变布局参数,通过改变LayoutParams,操作稍复杂

四、View的事件分发

      也就是对MotionEvent的分发,当一个MotionEvent产生以后,系统需要把这个事件传递给一个具体的View,这个传递过程就是分发过程,主要是三个重要方法:dispatchTouchEvent,onInterceptTouchEvent,onTouchEvent,(同一事件序列,指的是从Down,到move ,最后up的一系列动作)

      1. public bool dispatchTouchEvent(MotionEvent ev),

         用来分发事件,如果事件传递给当前View,那么这个方法一定会被调用,返回值表示是否消耗当前事件

      2. public bool onInterceptTouchEvent(MotionEvent ev),

         用来判断是否拦截某个事件,如果当前View拦截了某个事件,那么在同一事件序列中,这个方法不会再次被调用。 

         一般来说一个事件只能被一个View拦截且消耗。 

         一旦某个View决定拦截一个事件,那么同一个序列后续事件都会由他处理。 

         ViewGroup默认不拦截任何事件(本方法默认返回false)

      3. public bool onTouchEvent(MotionEvent ev),

         用来表示是否要消耗当前事件,如果不消耗,那么同一时间序列中,当前View不会再次接收到事件。

         如果View一旦开始处理事件,如果没有消耗ACTION_DOWN事件(返回false),那么同一序列的其他事件就不会再交给他处理,而是由父View的onTouchEvent来处理

 

  总的判断流程就是:当根ViewGroup接收到一个点击事件之后,他的 dispatchTouchEvent就会被调用来进行分发的判断,如果他的onInterceptTouchEvent返回ture,就表示这个group要拦截这个事件,然后就会调用他的onTouchEvent去处理这个事件,而如果onInterceptTouchEvent返回的是false,那么表示他不处理这个事件,事件就会被分发到子View,接着子View的dispatchTouchEvent就会被调用。 事件分发是由 Acitvity--Window--顶级View--下级View,这里考虑一个情况,如果View从上到下,onInterceptTouchEvent都返回false,就是都不拦截事件而是交给下一级来处理,那么到最下一ViewGroup的onInterceptTouchEvent返会true,拦截了事件(或者是View,View没有onInterceptTouchEvent,事件传递进来就会调用OnTouchEvent),但是onTouchEvent返回了false,没有消耗事件,那么事件将由他的上级View的onTouchEvent来处理,如果都返回false,那么就会层层上传,最后由Activity的onTouchEvent来处理。

 

滑动冲突解决方案*(待完善)

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值