文章目录
  1. 1. View基础知识
    1. 1.1. 什么是View
    2. 1.2. View的位置参数
    3. 1.3. MotionEvent和TouchSlop

来源:JiongBull’s Blog
微博:@JiongBull
GitHub:JiongBull

View基础知识

什么是View

  • View是Android中所有控件的基类,是一种界面层的控件的抽象。
  • ViewGroup也继承View,这意味着View本身就可以是单个控件也可以是由多个控件组成的一组控件,通过这种关系就形成了View树的结果,和Web前端中的DOM树概念是相似的。

View的位置参数

  • View的位置主要由它的四个顶点来决定,分别对应于View的四个坐标属性:left、top、right和bottom,这些坐标都是相对于View的父容器来说的,因此它是一种相对坐标。
  • 可以得出View的宽高与坐标的关系:
    1. width = right - left。
    2. height = bottom - top。
  • Android 3.0开始,View新增了几个参数: x、y、translationX和translationY,其中x和y是View的左上角坐标,而translationX和translationY是View左上角相对于父容器的偏移量,这几个参数也是相对于父容器的坐标,并且translationX和translationY的默认值是0,需要注意的是在平移的过程中,top和left表示的是原始左上角的位置信息,其值并不会发生改变,此时改变的是x、y、translationX和translationY四个参数。
    1. x = left + translationX。
    2. y = top + translationY。

MotionEvent和TouchSlop

  • 在手指接触屏幕后会产生一系列事件,它们被封装成MotionEvent,常用的事件类型有以下几种:
    1. ACTION_DOWN 手指刚接触屏幕。
    2. ACTION_MOVE 手指在屏幕上移动。
    3. ACTION_UP 手指从屏幕上松开的一瞬间。
    4. ACTION_CANCEL 手指还没松开时被强制终止(例如锁频)。
  • 正常情况下,一次手指触摸屏幕的行为会触发一系列点击事件,例如如下几种情况:
    1. 点击屏幕后松开,事件序列为:ACTION_DOWN -> ACTION_UP。
    2. 点击屏幕滑动一会再松开,事件序列为:ACTION_DOWN -> ACTION_MOVE -> ACTION_UP。
  • 通过MotionEvent对象可以得到点击事件发生的x和y坐标,getX()getY()返回相对于当前View左上角的x和y坐标,getRawX()getRawY()返回的是相对于手机屏幕左上角的x和y坐标。
  • TouchSlop是系统所能识别出的被认为是滑动的最小距离,也就是说,当手指在屏幕上滑动时,如果移动距离小于这个常量,那么系统就不认为是在进行滑动操作,和设备有关,在不同设备上的这个值可能是不同的,通过ViewConfiguration.get(getContext).getScaledTouchSlop()可以获得这个常量。
  • VelocityTracker用于追踪手指在滑动过程中的速度,包括水平和垂直方向的速度。
  • VelocityTracker的使用过程:

    1. 首先,在View的onTouchEvent()方法中追踪当前事件的速度。

      1
      2
      VelocityTracker velocityTracker = VelocityTracker.obtain();
      velocityTracker.add(event);
    2. 计算当前的滑行速度,参数是时间间隔。

      1
      velocityTracker.computeCurrentVelocity(1000);
    3. 获取水平和垂直方向的速度,即在时间间隔内移动的像素数。

      1
      2
      int xVelocity = (int) velocityTracker.getXVelocity();
      int yVelocity = (int) velocityTracker.getYVelocity();
    4. 不需要的时候需要重置并回收内存。

      1
      2
      velocityTracker.clear(); // 在ACTION_UP中执行
      velocityTracker.recycle(); // 最好在onDetachedFromWindow中执行
    5. 完整代码

  • 速度的计算公式:速度 = (终点位置 - 起点位置) / 时间,根据速度公式和Android系统的坐标系可知,手指逆着坐标系的正方向滑动,所产生的速度就为负值,时间间隔的单位是毫秒,计算速度时得到的速度就是在时间间隔内手指在水平或垂直方向上滑动的像素数。
  • GestureDetector用于辅助检测用户的单击、滑动、长按、双击等行为。
  • GestureDetector的使用过程:
    1. 创建GestureDetector对象并实现OnGestureListener接口。
      1
      2
      GestureDetector mGestureDetector = new GestureDetector(context, this);
      mGestureDetector.setIsLongpressEnabled(false); // 解决长按屏幕后无法拖动的现象
文章目录
  1. 1. View基础知识
    1. 1.1. 什么是View
    2. 1.2. View的位置参数
    3. 1.3. MotionEvent和TouchSlop