美文网首页Android
View的事件体系

View的事件体系

作者: 和莱 | 来源:发表于2020-03-20 14:34 被阅读0次

    View基础知识

    什么是View

    View是Android中所有控件的抽象,不管是简单的Button、TextView还是复杂的RelativeLayout和ListView,他们的共同基类都是View。

    View的位置参数

    Left是左上角横坐标、Top是左上角纵坐标、Right是右下角横坐标、Bottom是右下角纵坐标。这些坐标都是相对于父容器来说的。x和y是左上角的绝对坐标,translationX和translationY是View左上角相对于父容器的偏移量。

    一些对象和常数

    MotionEvent,在手指接触屏幕后所产生的一系列事件,典型的有:
    ACTION_DOWM,手指刚刚接触到屏幕、ACTION_MOVE,手指在屏幕上移动、ACTION_UP手指离开屏幕。

    TouchSlop是一个常数,是系统所能识别出的滑动的最小距离,因平台不同会有差异,当我们处理滑动事件时可以使用这个常数过滤掉那些滑动距离小于这个常数的事件。

    VelocityTracker是速度追踪器,用来检测手指在滑动屏幕过程中的速度;
    GestureDetector检测手势,包括单击、滑动、双击、长按等。

    Scroller弹性滑动对象,使用scrollTo或者scrollBy滑动对象是在瞬间完成的,没有过渡效果用户体验不好,使用Scroller滑动是在一定时间间隔内完成的。

    View滑动

    使用scrollTo和scrollBy实现滑动

    scrollTo是基于绝对位置的滑动,scrollBy中调用了scrollTo方法,实现的是基于相对位置的滑动。这两个方法都只能改变内容的位置,不能改变内容所在的View的位置。

    使用动画实现滑动

    使用View滑动并不能真正的改变View的位置,主要适用于没有交互的View,Android3.0以上版本没有这个问题。

    通过改变布局参数

    比如想把一个Button向右平移100px,只需要把marginLeft的值增加100。

    弹性滑动

    使用Scroller

    这种方法实现弹性滑动的原理是调用invalidate方法,在invalidate方法中调用draw方法重绘View,在Draw方法中会调用scrollCompute方法,我们只需要实现这个方法即可。通过动画和延时策略也可以实现弹性绘制。

    View事件分发机制

    即产生一个MotionEvent的点击事件以后,系统需要把这个事件传递给一个具体的View进行处理。
    点击事分发过程由三个方法共同完成,dispatchTouchEvent,用来进行事件的分发,如果事件能够传递给当前的View,此方法一定会被调用,返回结果受当前View的onTouchEvent和下级View的dispatchTouchEvent方法的影响。
    onInterceptTouchEvent,是否拦截某个事件,如果当前View拦截了某个事件,那么在同一个事件序列当中这个方法不会再被调用。
    onTouchEvent用来处理点击事件,如果不处理,那同一个事件序列中这个方法也不会再被调用。

    对于一个根ViewGroup来说,当点击事件发生后,他的dispatchTouchEvent会被调用,如果中国ViewGroup的onInterceptTouchEvent会被调用,如果这个方法返回的是true,那么他的onTouchEvent方法会被调用,用来处理这个点击事件,如果返回结果是false,那么下一级View的dispatchTouchEvent会被调用,不断如此。

    当一个View如果需要处理点击事件时,如果设置了onTouchListenner,onTouch方法会被回调,如果返回true,那么事件由onTouch方法处理,如果返回false,那事件交由onTouchEvent方法处理。在onTouchEvent方法中,如果设置了onClickListenner,那事件交由onClick处理。

    当一个点击事件产生以后,他的传递顺序是Activity——>Window——>View,事件总是先传给Activity,Activity再传递给Window,Window将事件传递给顶级View,再按事件方法机制去处理。

    View滑动冲突

    常见的滑动冲突有外部滑动方向和内部滑动方向不一致、外部滑动方向和内部滑动方向不一致、前两者嵌套。
    对于第一种情况、可以判断滑动方向,如果是外部的滑动方向,外部拦截事件并处理,如果是内部的滑动方向,内部拦截然后处理。
    滑动冲突解决方式包括外部拦截和内部拦截。

    相关文章

      网友评论

        本文标题:View的事件体系

        本文链接:https://www.haomeiwen.com/subject/tapoehtx.html