一、什么是View

Android中,控件大致可分为两大类,即View与ViewGroup。View是Android中所有控件的基类,是控件的一种抽象。ViewGroup即控件组,可以把它看作一个容器,因为它可以包含多个View及ViewGroup。通过ViewGroup,整个界面上的控件形成了一个树形结构,也就是我们常说的控件树。

二、Android中的坐标系

根据参考对象的不同,Android中存在两个坐标系。一个是Android坐标系,一个是视图坐标系,两者的区别在于坐标原点的选取。坐标系的单位长度是1px。

android中的坐标系.png
1. Android坐标系

Android坐标系的坐标原点是手机屏幕左上角,向右为X轴正方向,向下为Y轴正方向。方法getRawX()和getRawY()获得的坐标就是此坐标系中的坐标。

2. 视图坐标系

视图坐标系的坐标原点是父控件的左上角,向右为X轴正方向,向下为Y轴正方向。其实大多数与位置有关的参数都是视图坐标系中的坐标点。

三、位置参数与方法

位置参数与方法繁多,但这些都是必须掌握的,是触摸事件、滑动控件的基础。学习这些参数、方法最有效的方式就是自己打Log,根据Log信息去分析方法的含义。


位置参数方法.png
  • View提供的获取坐标的方法:
    getTop():view自身顶边到父控件顶边之间的距离。
    getLeft():view自身左边到父控件左边之间的距离。
    getRight():view自身右边到父控件左边之间的距离。
    getBottom():view自身下边到父控件顶边之间的距离。

note:这几个方法获取的是视图坐标值。它们只与view初始摆放位置有关,也就是说在移动控件的过程中,这些方法的返回值是不会随控件的位置改变的,除非认为修改了它们的值,如修改了margin值。

  • MotionEvent(触摸事件)提供的方法:
    getX():点击事件(触控点)距离当前控件左边之间的距离。
    getY():点击事件(触控点)距离当前控件顶边之间的距离。
    getRawX():点击事件(触控点)距整个屏幕左边之间的距离。
    getRawY():点击事件(触控点)距整个屏幕上边之间的距离。

note:前两个方法获取的坐标值是视图坐标值。你可以将触控点理解为当前view中的内容,那么它的父控件就是当前view。
后两个方法获取的坐标值是绝对坐标值。这四个方法通常用来计算偏移量。

四、MotionEvent——触控事件

MotionEvent即触控事件,典型触控事件有如下几种:

  • ACTION_DOWN=0——单点触摸按下;
  • ACTION_MOVE=2——触摸点移动;
  • ACTION_UP=1——单点触摸抬起;
  • ACTION_CANCEL=3——触摸动作取消;
    正常情况下,一次手指触摸屏幕的行为至少会有两个事件发生,即按下抬起(按下取消)。这其中还可能会有一系列的ACTION_MOVE事件。

通常情况下,我们会在onTouchEvent(MotionEvent event)方法中通过event.getAction()方法获取触控事件的类型,并使用switch语句筛选,模板代码如下:

  public boolean onTouchEvent(MotionEvent event){  //获取当前输入点的坐标      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;      }

五、TouchSlop——最小滑动距离

TouchSlop即最小滑动距离,当你两次滑动之间的距离差小于这个常量(这个常量和设备有关)时,系统不认为你进行了滑动操作,这样我们可以使应用具有更好的用户体验。
可以通过如下方法获得这个值:

ViewConfigration.get(getContext()).getScaledTouchSlop();

同样,你也可以在源码中找到这个常量的定义:

Path:frameworks/base/core/res/res/values/config.xml

六、VelocityTracker——速度追踪器

速度追踪器,用它可以监测手指水平竖直滑动速度。使用步骤:

  1. 关联触摸事件
    VelocityTracker velocityTracker=VelocityTracker.obtain();
    velocityTracker.addMovement(event);
  2. 计算速度
    velocityTracker.computeCurrentVelocity(1000);
    //这里的参数是指“时间间隔”,速度=(终点-起点)/时间段,由此可知我们计算的速度是平均速度,速度可正可负,单位为像素/秒或者像素/毫秒。
  3. 获取速度(获取之前必须先计算)
    int xVelocity=(int)velocityTracker.getXVelocity();
    int yVelocity=(int)velocityTracker.getYVeloctiy();
  4. 重置并回收
    velocityTracker.clear();
    velocityTracker.recycle();

七、GestureDetector——手势监测器

手势监测,顾名思义,用于监测用户单击,滑动,长按,双击等行为。步骤如下:

  1. 创建GestureDetector对象,实现OnGestureListener接口
    GestureDetector mGestureDetector=new GestureDetector(this);
  2. 接管目标view的onTouchEvent方法
    boolean consume=mGestureDetector.onTouchEvent(event);
    return consume;
  3. 有选择的实现OnGestureListener和OnDoubleTapListener中的方法,这两个接口中有各种各样的诸如,单击,双击,长按,严格单击等等方法。这里不一一列出,可去查看相关文档。

建议:如果只是监听滑动相关的事件,使用onTouchEvent方法,如果监听双击事件,使用GestureDetector实现。

结语

基础知识先写到这里,本人也是一个初学者,未免出现对知识点理解不全面的情况,有问题可留言,希望能与大家互相讨论,共同学习。
转载请注明出处http://www.jianshu.com/p/b600895c585b 谢谢。

更多相关文章

  1. android自定义ViewGroup基础
  2. MUI在ios中的一些问题
  3. android 滑动相关(一) : OnScrollListener
  4. Android(安卓)之 ViewTreeObserver 全面解析
  5. Android初级程序员需要掌握的知识
  6. Android中WebView的使用指南:
  7. Android的一些冷知识
  8. Android中Context的总结及其用法
  9. Android类库打包方法探究

随机推荐

  1. MySQL分页Limit的优化过程实战
  2. mysql增量备份及断点恢复脚本实例
  3. 在golang中操作mysql数据库的实现代码
  4. centos7.4系统中yum源安装mysql 5.6
  5. Navicat修改MySQL数据库密码的多种方法
  6. 详解 Mysql中的delimiter定义及作用
  7. mysql server 8.0.3安装配置方法图文教程
  8. mysql 8.0.12 winx64下载安装教程
  9. RHEL7.5下mysql 8.0.11安装教程
  10. Linux下mysql 8.0安装教程