1.Android坐标系

  在物理学中,要描述一个物体的运动,就必须选定一个参考系。所谓滑动,正是相对于参考系的运动。在Android中,将屏幕最左上角的顶点作为Android坐标系的原点,从这个点向右是X轴正方向,从这个点向下是Y轴的正方向,如下图所示:

  系统提供了getLocationOnScreen(int location[])这样的方法来获取Android坐标系中点的位置,即该视图左上角在Android坐标系的坐标。另外,在触控事件中使用getRawX()、getRawY()方法所获得的坐标同样是Android坐标系中的坐标。

2.视图坐标系

父视图左上角为坐标原点,如下图所示:


  在触控事件中,通过getX()、getY()所获得的坐标就是视图坐标系中的坐标。

3.触控事件——MotionEvent

  触控事件MotionEvent在用户交互中,站着举足轻重的地位,学好触控事件是掌握后序内容的基础。首先,来看看MotionEvent中封装的一些常用的事件常量,它定义了触控事件的不同类型。

// 单点触摸按下动作
public static final int ACTION_DOWN             = 0;
// 单点触摸离开动作
public static final int ACTION_UP               = 1;
// 触摸点移动动作
public static final int ACTION_MOVE             = 2;
// 触摸动作取消
public static final int ACTION_CANCEL           = 3;
// 触摸动作超出边界
public static final int ACTION_OUTSIDE          = 4;
// 多点触摸按下动作
public static final int ACTION_POINTER_DOWN     = 5;
// 多点离开动作
public static final int ACTION_POINTER_UP       = 6;      复制代码
 // 单点触摸按下动作
public static final int ACTION_DOWN             = 0;
// 单点触摸离开动作
public static final int ACTION_UP               = 1;
// 触摸点移动动作
public static final int ACTION_MOVE             = 2;
// 触摸动作取消
public static final int ACTION_CANCEL           = 3;
// 触摸动作超出边界
public static final int ACTION_OUTSIDE          = 4;
// 多点触摸按下动作
public static final int ACTION_POINTER_DOWN     = 5;
// 多点离开动作
public static final int ACTION_POINTER_UP       = 6;      复制代码

  通常情况下,我们会在onTouchEvent(MotionEvent event)方法中通过event.getAction()方法来获取触控事件的类型,并使用switch-case方法来进行筛选,这个代码的模式基本固定,如下所示:

@Override
public boolean onTouchEvent(MotionEvent event) {
    // 获取当前输入点的X、Y坐标(视图坐标)
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 处理输入的按下事件
            break;
        case MotionEvent.ACTION_MOVE:
            // 处理输入的移动事件
            break;
        case MotionEvent.ACTION_UP:
            // 处理输入的离开事件
            break;
    }
    return true;
}复制代码
@Override
public boolean onTouchEvent(MotionEvent event) {
    // 获取当前输入点的X、Y坐标(视图坐标)
    int x = (int) event.getX();
    int y = (int) event.getY();
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            // 处理输入的按下事件
            break;
        case MotionEvent.ACTION_MOVE:
            // 处理输入的移动事件
            break;
        case MotionEvent.ACTION_UP:
            // 处理输入的离开事件
            break;
    }
    return true;
}复制代码

  在不涉及多点操作的情况下,通常可以使用以上代码来完成触控事件的监听,不过这里只是一个代码模板,后面我们会在触控事件中完成具体的逻辑。
  在Android中,系统提供了非常多的方法来获取坐标值、相对距离等。方法丰富固然好,但也给初学者带来了很多困惑,不知道在什么情况下使用什么方法,下面总结了一些API,结合Android坐标系来看看该如何使用它们,如下图所示:




获取坐标值、相对距离的方法可以分成如下两个类别:



  • View提供的获取坐标方法

  getTop():获取到的是View自身的顶部到其父View顶部的距离。
  getLeft():获取到的是View自身的左侧到其父View左侧的距离。
  getRight():获取到的是View自身的右侧到其父View左侧的距离。
  getBottom():获取到的是View自身的底部到其父View顶部的距离。

  • MotionEvent提供的方法

  getX():获取触摸点距离View左侧的距离,即视图坐标。
  getY():获取触摸点距离View顶部的距离,即视图坐标。
  getRawX():获取触摸点距离整个屏幕左侧的距离,即绝对坐标。
  getRawY():获取触摸点距离整个屏幕顶部的距离,即绝对坐标。

注意:View的坐标系统是相对于父控件而言的。