Android坐标系、视图坐标系与触控事件(MotionEvent)

Ies71Z 7年前
   <h3><strong>前言:</strong></h3>    <p>本篇文章讲解Android坐标系、视图坐标系与触控事件(MotionEvent)</p>    <h3><strong>一. Android 的坐标系:</strong></h3>    <p>在Android中,将屏幕左上角的定点座位Android坐标系的原点,从这个点向右是X轴得正方向,这个点向下为Y轴正方向:</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/435cfd652fc60dd9c7fc4b47c8eff12c.png"></p>    <p style="text-align:center">Android坐标系.png</p>    <p>系统提供了 <strong>getLocationOnScreen(intlocation[])</strong> 这样的方法来获取Android <strong>坐标系中 点的位置</strong> ,即该视视图左上角在Android坐标系中的坐标,另外在触控事件中使用 <strong>getRawX().getRawY()</strong> 方法所获取得坐标同样是Android坐标系中的坐标:</p>    <p><strong>getLocationOnScreen(intlocation[])方法:</strong></p>    <pre>  <code class="language-java">private int[] locationPoint = new int[2];  //省略.....  view.getLocationOnScreen(locationPoint);  //省略.....  sb.append("length :" + locationPoint.length + " -- ");  for (int i : locationPoint) {     sb.append(i + "--");  }  //结果:length : 0 -- 152 -- ``  //locationPoint[0]:为x该View在x轴得坐标,locationPoint=[1]为该View在Y轴的坐标</code></pre>    <p><strong>在触控事件中使用getRawX() 与getRawY()方法:</strong></p>    <pre>  <code class="language-java">@Override  public boolean onInterceptTouchEvent(MotionEvent ev) {    switch (ev.getAction()){      case MotionEvent.ACTION_DOWN:          downX = ev.getRawX();          downY = ev.getRawY();          break;   }</code></pre>    <h3><strong>二.视图坐标系:</strong></h3>    <p>Android中还有一个视图坐标系,让是描述子视图在父视图中的位置。与Android坐标系比较相似的, 视图坐标系是以子视图所在的父视图左上角为原点,该原点向右为X轴正方向 ,向下为Y轴正方向:</p>    <p>在触控事件中,可使用 <strong>getX(), getY()</strong> 方法获取得坐标即为视图坐标系中的坐标</p>    <p style="text-align: center;"><img src="https://simg.open-open.com/show/f9dbfaa2f04d4eebb46a0f90143c1d4a.png"></p>    <p style="text-align:center">视图坐标2.png</p>    <h3><strong>三.触控事件 MotionEvent:</strong></h3>    <p>触控事件,见明知意;下面是MotionEvent中封装了一些常用的事件常量:</p>    <pre>  <code class="language-java">//触控动作取消  public static final int ACTION_CANCEL = 3;  //单点触控按下动作  public static final int ACTION_DOWN = 0;  //触摸点移动动作  public static final int ACTION_MOVE = 2;  //触摸动作超出边界  public static final int ACTION_OUTSIDE = 4;  /** @deprecated */  @Deprecated  public static final int ACTION_POINTER_1_DOWN = 5;//多点触控按下动作  /** @deprecated */  @Deprecated  public static final int ACTION_POINTER_1_UP = 6;//多点触控抬起动作  /** @deprecated */  @Deprecated  public static final int ACTION_POINTER_2_DOWN = 261;  /** @deprecated */  @Deprecated  public static final int ACTION_POINTER_2_UP = 262;</code></pre>    <p>通常会在onTouchEvent(MotionEvent event)或onInterceptTouchEvent(MotionEvent event)方法中通过event.getAction()获取触控事件类型 并进行对应逻辑处理</p>    <pre>  <code class="language-java">@Override   public boolean onInterceptTouchEvent(MotionEvent ev) {   switch (ev.getAction()){      case MotionEvent.ACTION_DOWN:          downX = ev.getRawX();          break;      case MotionEvent.ACTION_MOVE:          moveX = ev.getRawX();          break;      default:          break;</code></pre>    <p>在触控事件时经常需要 <strong>获取坐标值与相对距离</strong> 等 进行了一下总结:</p>    <p><img src="https://simg.open-open.com/show/897a01ca2dc68bf5222e9723aafd898d.png"></p>    <p style="text-align:center">View坐标与距离3.png</p>    <p>View获取坐标的方法:</p>    <p>getTop() : 获取该View顶边框到其 <strong>父布局顶边</strong> 的距离;</p>    <p>getLeft() : 获取该View左边到框其 <strong>父布局左边</strong> 的距离;</p>    <p>getRight() : 获取该View右边框到 <strong>父布局左边</strong> 的距离 ;</p>    <p>getBottom : 获取该View底部边框到 <strong>父布局顶部边框</strong> 的距离;</p>    <p>MotionEvent 获取坐标的方法:</p>    <p>getX() : 获取事件点击位置 <strong>所在控件左边</strong> 的距离;</p>    <p>getY() : 获取事件点击位置 <strong>所在控件顶边</strong> 的距离;</p>    <p>getRawX() : 获取事件点击位置距离 <strong>屏幕左边</strong> 的距离;</p>    <p>getRawY() : 获取事件点击位置距离 <strong>屏幕顶边</strong> 的距离;</p>    <p> </p>    <p> </p>    <p>来自:http://www.jianshu.com/p/678e30b60f4d</p>    <p> </p>