Android坐标系、视图坐标系与触控事件(MotionEvent)
Ies71Z
8年前
<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>