zoukankan      html  css  js  c++  java
  • View的事件体系

    1、View基础                                                      

    View是Android中所有控件的基类,View是一种界面层的控件的一种抽象,View代表了一个控件。

    ViewGroup(控件组),内部包含了许多个控件,即一组View。ViewGroup继承自View,这就意味着View本身就可以是单个控件,也可以是由多个控件组成的一组控件。

    View的位置主要由它的四个顶点来决定,分别对应于View的四个属性:top、left、right、bottom。这些坐标都是相对于View的父容器来说的,因此这四个顶点是一种相对坐标。

    从Android3.0开始,View增加了额外的几个参数:x、y、tarnslationX和translationY,其中x和y是View左上角的坐标,而translationX和translationY是View左上角相对于父容器的偏移量。这几个参数也是相对于父容器的坐标,并且translationX和translationY的默认值是0。

    需要注意的是,View在平移的过程中,top和left表示的是原始左上角的位置信息,其值并不会发生改变,此时发生改变的是x、y、translationX和translationY这四个参数。

    2、MotionEvent和TouchSlop                               

    在手指接触屏幕后所产生的一系列事件中,典型的事件类型有如下几种:

    ACTION_DOWN:手指刚接触屏幕;

    ACTION_MOVE:手指在屏幕上移动;

    ACTION_UP:手指从屏幕上松开的一瞬间。

    通过MotionEvent对象我们可以得到点击事件发生的x和y坐标。为此,系统提供了两组方法:getX/getY和getRawX/getRawY。它们的区别很简单,getX/getY返回的是相对于当前View左上角的x和y坐标,而getRawX/getRawY返回的是相对于手机屏幕左上角的x和y坐标。

    TouchSlop 是系统所能识别出的被认为是滑动的最小距离。如果滑动距离小于这个常量,系统不认为它是滑动的。这是一个常量和设备有关,可以在处理滑动时用来做一些过滤。

    3、VelocityTracker、GestureDetector和Scroller 

    VelocatyTracker:速度追踪,用于追踪手指在滑动过程中的速度,包括水平和竖直方向的速度。

    GestureDetector:手势检测,用于辅助检测用于的单击、滑动、长按、双击等行为。

    Scroller:弹性滑动对象,用于实现View的弹性滑动。使用Scroller来实现有过渡效果的滑动,其过程不是瞬间完成的,而是在一定的时间间隔内完成的。Scroller本身无法让View弹性滑动,它需要和View的computeScroll方法配合使用才能共同完成这个功能。

    4、View的滑动                                                       

    通过三种方式可以实现View的滑动:

    a、通过View本身提供的scrollTo/scrollBy方法来实现滑动;只能将View的内容进行移动,并不能将View本身进行移动。

    b、通过动画给View施加平移效果来实现滑动;主要是操作View的translationX和translationY属性,可以用传统的View动画,也可以用属性动画。

    c、通过改变View的LayoutParams使得View重新布局从而实现滑动。

    5、View的事件分发机制                                           

    当一个MotionEvent产生了以后,系统需要把这个事件传递给一个具体的View,而这个过程就是分发过程。点击事件的分发过程由三个很重要的方法来共同完成:dispatchTouchEvent、onInterceptTouchEvent和onTouchEvent。

    6、View的滑动冲突                                                 

    在界面中只要内外两层同时可以滑动,这个时候就会产生滑动冲突。

    两种解决滑动冲突的方式:外部拦截法和内部拦截法。

    外部拦截法:指点击事情都经过父容器的拦截处理,如果父容器需要此事件就拦截,如果不需要此事件就不拦截。外部拦截法需要重写父容器的onInterceptTouchEvent方法。

    内部拦截法:指父容器不拦截任何事件,所有的事件都传递给子元素,如果子元素需要此事件就直接消耗掉,否则就交由父容器进行处理。这种方法需要配合requestDisallowInterceptTouchEvent方法才能正常工作,使用起来较外部拦截法稍显复杂。

  • 相关阅读:
    linux 开发GTK需要的初始配置
    Kernel panic not syncing: cannot execute a PAEenabled kernel on PAEless CPU
    在NetBeans IDE 6.9.1上搭建Android SDK环境(WIN和Linux平台)
    Gtk+ Tutorials & Resources
    新手上路学习配置C,C++,GTK等开发环境
    又是忙碌的一天
    Graphics Programming on linux using C用c语言开发图形界面
    如何在Netbeans下配置Android开发环境 a platform target has to be selected
    linux终端中最漂亮的几款字体介绍及安装
    自已接触过的数据访问方式总结
  • 原文地址:https://www.cnblogs.com/fankongkong/p/7286948.html
Copyright © 2011-2022 走看看