View的事件体系

View基础知识:
    什么是View:
        View是android 中所有控件的基类。View是界面层控件的一种抽象。

    View的位置参数:
        View的位置主要由四个顶点来决定,分别是对应于View的四个属性:top,left,right,bottom,其中top是左上角纵坐标,left是左上角横坐标,right是右下角横坐标,bottom是右下角纵坐标。需要注意的是这些坐标都是相对于View的父容器来说的,因此它是一种相对坐标。
            

            View的宽高坐标关系:
                    
    
    获取View的四个参数如下图所示:
        
    从3.0开始,View增加了额外的几个参数,X,Y,translationX, translationY,其中,X,Y是View左上角的图标,translationX,translationY是View左上角相对于父容器的偏移量,默认值为0。View也为这几个参数提供了get/set方法,换算关系如下:
        

    MotionEvent和TouchSlop
         MotionEvent
            在手指接触屏幕后所产生的一系列时间中,典型的事件类型有如下几种:
                
    对于我们得到点击时间的X和Y坐标,系统提供了两组方法,getX/getY和getRawX/ getRawY。区别:
            getX/getY 返回的是相对于当前View左上角的X和Y坐标。
            getRawX/getRawY 返回的是相对于手机屏幕左上角的X和Y坐标。


    TouchSlop:
        该值是系统所能识别的最小距离,当手指在屏幕上滑动时,如果两次滑动之间的距离小于这个常量,那么系统就不认为你是在进行滑动操作。该值和设备有关,在不同的设备上,这个值可能是不同的。通过ViewConfiguration.get(getContext()).getScaledTouchSlop() 。

    VelocityTracker    GestureDetector  和  Scroller

        1. VelocityTracker是用于追踪手指在屏幕上滑动的速度。
            
            当我们先知道当前的滑动速度的时候,这个时候采用如下方式就能获取到当前的速度:
            
        如何计算当前手指在屏幕上滑动的速度(这里注意在屏幕滑动的时候起点终点有可能是负数):

                                                        速度 = (终点位置 — 起点位置)/ 时间段

        最后,当不需要它的时候,需要调用clear方法重置并回收内存:
            

    2.  GestureDetector  
            手势检测,用于辅助检查用户的单击,滑动,长按,双击等行为。

            首先是创建GestureDetector  对象,我们还可以实现OnDoubleTapListener从而双击行为。
                

       接管目标View的onTouchEvent方法,在待监听View的onTouchEvent方法中添加如下实现。
                

        做完上面的两步,我们就可以有选择地实现OnGrstureListener和OnDoubleTapListener中的方法了,这两个接口中的方法在吐下表中:
            
            

    建议:
            如果只是监听滑动相关的,建议自己在onTouchEvent中实现,如果要监听双击这种行为的话,那么久使用                                    GestureDectector。

    3.   Scroller
          用于实现View的弹性滑动。

    
View的滑动:
    View的滑动中一般采用三种方式:
            第一种是通过View本身提供的ScrollTo/ScrollBy方法来实现滑动,
            第二种是通过动画给View施加平移效果来实现滑动。
            第三种是通过改变View的LayoutParams使得View重新布局从而实现滑动。

    3.2.1 使用ScrollTo/ScrollBy
        利用这两个值就可以了进行滑动,在滑动过程中,View内部有两个属性:mScrollX、mScrollY。这两个值可以通过getScrollX和    getScrollY获得。
        总结:使用ScrollTo/ScrollBy滑动,只能将View的内容进行移动,并不能将View本身移动。如下图所示:
            

    3.2.2 使用动画
        本节介绍了使用动画来实现View的滑动,主要操作是View的translationX和 translationY属性,既可以使用传统的View动画,也可以采用属性动画,如果采用属性动画的话,为了能够兼容3.0以下设备,需要采用开源动画库nineoldandroids(http://nineoldandroids.com/)。
        采用View的动画代码,让View在100ms内将一个View从原始位置向右下角移动100个像素。
            
    总结:上述的View动画,会出现一个问题,就是在View移动之后,View的操作事件始终都是停留在原始位置的,这个情况View的属性动画就能完美的解决这一问题的出现。
    解决方案:在View移动后的位置也创建一个一模一样的View,当View完成移动后给当前的View进行显示,移动之前进行隐藏。

        如果采用的View的属性动画,将View在100ms内,从原始位置向右平移100像素。
            

    3.2.3 改变布局参数
        通过改变LayoutParams的方式去实现View的滑动,在要滑动的View的左边放置一个空View,将要滑动时,设置这个空View的大小即可完成View的滑动。代码如下:
    

    3.2.4 各种滑动方式的对比
        总结如下:
            
        
3.3 弹性滑动
    3.3.1 使用Scroller
         Scroller本身是不能进行View的滑动的,他需要配合View的computeScroll方法才能实现弹性滑动的效果。

    3.3.2 通过动画
        动画本身就是一个渐近的过程,因此通过它来实现滑动天然就具有了弹性滑动的效果,如下实例就是讲View用100ms进行向右滑    动100像素。
            
        通过 Scroller实现View的弹性动画
            
            

    3.3.3 延迟策略
        就是通过演示操作来进行滑动   通过Handler,或者是通过sleep进行。

3.4 View事件分发机制
    3.4.1 点击事件的传递规则
        点击事件的分发过程由3个方法来完成:dispatchTouchEvent、onInterceptTouchEvent、。

        public boolean  dispatchTouchEvent(MotionEvent ev)
            返回结果表示是否消耗当前事件。返回结果受当前View的onTouchEvent和下级的dispatchTouchEvent方法的影响。

        public boolean onInterceptTouchEvent(MotionEvent ev)
            在上述方法内部调用,返回结果表示是否拦截当前事件,如果当前View拦截了某个事件,那么在同一事件中,此方法只会被调用一次。

        public boolean onTouchEvent(MotionEvent ev)
            在dispatchTouchEvent方法中调用,用来处理点击事件,返回结果表示是否消耗当前事件。

        下面如图就能表现三个方法的关系:
            

    关于事件传递的总结:
        (1)同一事件是指,手指按下的一刻到抬起的时候这个属于同一事件   down——move(可以是多个)——up。
        (2)一个事件只能被一个View拦截消耗。
        (3)ViewGroup默认不消耗任何事件,源码中 ViewGroup的onInterceptTouchEvent方法默认返回false。
        (4)事件的传递过程是由外向内的,事件首先是传递给父元素,然后又父元素分发给字View ,通过                                    requestDisallowInterceptTouchEvent方法可以在子元素中干预父元素的时间分发过程,但是ACION_DOWN事件除外。
 
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值