内容简介:事件体系里,除其余内容基本都是阅读《Android 开发艺术探索》(任玉刚 著)这本书后整理的笔记,内容估计和书上差别不大,已经阅读过书籍的,可以不用阅读了,有兴趣的可以看看《事件分发机制》那篇博客,那篇要比书上讲解的要深入许多。为了配合《事件分发机制》那篇博客,所以这篇博客没写完就发出来了,距离完整版可能还会延期 N 久,捂脸。
事件体系里,除 《Android 事件分发机制》 这部分内容,是较深入研究了源代码后总结整理出来的。
其余内容基本都是阅读《Android 开发艺术探索》(任玉刚 著)这本书后整理的笔记,内容估计和书上差别不大,已经阅读过书籍的,可以不用阅读了,有兴趣的可以看看《事件分发机制》那篇博客,那篇要比书上讲解的要深入许多。
为了配合《事件分发机制》那篇博客,所以这篇博客没写完就发出来了,距离完整版可能还会延期 N 久,捂脸。
前言
文章重点内容为:事件分发机制、滑动冲突解决
目录(兼容稀土掘金)
- 一、View 的位置参数
- 二、MotionEvent 和 TouchSlop
- 三、事件分发机制(另一篇博客)
- 三个重要方法
- 事件分发机制简略过程图
- 从 Activity 到 View 的事件传递过程(简略)
- View 的事件传递
- ViewGroup 的事件传递
- 从 Activity 到 View 的事件传递过程(完整)
- 四、
一、View 的位置参数
位置参数都是相对父容器的坐标。坐标单位都是 pixel,可归类为以下三类:
- View 的 原始 左上角(left, top)、右下角(right, bottom)的坐标决定 View 的位置
- View 的左上角坐标(x, y)
- translationX、translationY 表示 View 的左上角相对父容器的偏移量
区别
View 在平移的过程中,top、left 表示 原始 左上角的坐标,其值不会发生改变。此时该改变的是x、y、translationX、translationY Android 3.0 开始,才追加 x、y、translationX、translationY
它们的转换规则为
x = left + translationX y = top + translationY 复制代码
相关API
getTop() getBottom() getLeft() getRight() getX() getY() getTranslationX() getTranslationY() 复制代码
二、MotionEvent 和 TouchSlop
- MotionEvent
表示手指触摸屏幕所产生的一系列事件。类型有:
final int ACTION_DOWN = 0; // 典型事件 final int ACTION_UP = 1; // 典型事件 final int ACTION_MOVE = 2; // 典型事件 final int ACTION_CANCEL = 3; final int ACTION_OUTSIDE = 4; final int ACTION_POINTER_DOWN = 5; // 貌似是多鼠标操作 final int ACTION_POINTER_UP = 6; final int ACTION_HOVER_MOVE = 7; final int ACTION_SCROLL = 8; final int ACTION_HOVER_ENTER = 9; // 鼠标悬浮 final int ACTION_HOVER_EXIT = 10; final int ACTION_BUTTON_PRESS = 11; // 按钮按下 final int ACTION_BUTTON_RELEASE = 12; // 按钮释放 复制代码
相关API
// 获取鼠标坐标:相对当前 View 的左上角的 x 和 y 坐标 getX() getY() // 获取鼠标坐标:获取相对手机屏幕的左上角的 x 和 y 坐标 getRawX() getRawY() 复制代码
- TouchSlop:最小滑动距离
TouchSlop 是系统所能识别出的被认为是滑动的最小距离。即当手指在手机屏幕上的滑动距离小于该值时,那么系统不认为你在进行滑动操作。默认最小值为 8dp。
定义文件路径:framewoks/base/core/res/res/values/config.xml
相关API
ViewConfiguration.get(context).getScaledTouchSlop(); 复制代码
三、事件分发机制(另一篇博客)
详细内容见博客《Android View 的事件体系 -- 事件分发机制》,链接见文章头部
四、滑动冲突
同样包含在博客《Android View 的事件体系 -- 事件分发机制》中了
下面的内容基本可以不用看了,捂脸
VelocityTracker
GestureDetector
Scroller
五、View 的滑动
实现 View 的滑动有三种方法:
- 通过 View 本身提供的 scrollTo()、scrollBy()
- 通过动画给 View 施加平移效果
- 通过改变 View 的 位置参数或 LayoutParams 使得 View 重新布局来实现滑动
1. scrollTo()、scrollBy() 实现滑动
这两个方法都是将 View 内容进行移动,并不是将 View 本身进行移动。它们的具体实现如下:
/** * View 类 */ /** * @param x 水平方向的偏移量,单位 pixel * @param y 垂直方向的偏移量,单位 pixel */ public void scrollTo(int x, int y) { // mScrollX: 表示 View 左边缘与 View 内容左边缘的水平方向的距离,单位 pixel // mScrollY: 表示 View 上边缘与 View 内容上边缘的垂直方向的距离,单位 pixel if (mScrollX != x || mScrollY != y) { int oldX = mScrollX; int oldY = mScrollY; mScrollX = x; mScrollY = y; invalidateParentCaches(); onScrollChanged(mScrollX, mScrollY, oldX, oldY); if (!awakenScrollBars()) { postInvalidateOnAnimation(); } } } public void scrollBy(int x, int y) { scrollTo(mScrollX + x, mScrollY + y); } 复制代码
2. 平移动画实现滑动
具体实现不多说。View 动画是对 View 的影像做操作,并不会真正改变 View 的位置参数。如果希望改变 View 的位置参数,则可以通过属性动画实现。
3. 改变位置参数或 LayoutParams 实现滑动
改变的是 View 本身的位置参数或 LayoutParams。有两种方法实现:
- 修改 View 的 marginLeft 等参数实现
- 在 View 的反向位置放置一个空白 View。通过修改空白 View 的宽高实现。
参考代码:
// 改变 LayoutParams 参数 MarginLayoutParams mlp = (MarginLayoutParams) button.getLayoutParams(); mlp.leftMargin += 100; // 方法一 mlp.width += 100; // 方法二 button.requestLayout(); // 或 button.setLayoutParams(mlp); // 改变位置参数 button.setTranslationX(50); // 方法一 button.setTranslationY(50); // 方法一 复制代码
4. 三种方法对比
总结如下:
- scrollTo()、scrollBy():操作简单,适合对 View 内容的滑动
- 动画:操作简单,适用于没有交互的 View 和实现复杂动画效果
- 改变 LayoutParams:操作稍微复杂,适用于有交互的 View
以上所述就是小编给大家介绍的《Android View 的事件体系》,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对 码农网 的支持!
猜你喜欢:- View 体系详解:坐标系、滑动、手势和事件分发机制
- 编程体系结构:Java 异常体系
- 企业安全体系架构分析:安全体系架构概述
- 产品数据体系建设基础:一个产品的数据体系建设
- 指标体系:四个模型教会你指标体系构建的方法
- RTC 技术知识体系
本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们。
操作系统基础教程
戴维斯 / 第1版 (2006年7月1日) / 2006-7 / 34.0
这是一本关于操作系统基本原理的教科书,其最大特点就是从操作系统的分层概念出发,深入浅出地介绍了操作系统的基本概念和基本框架。本书可以作为高等院校非计算机专业相关课程的教材或参考书,也适合具有高中以上数学基础的计算机用户自学,还可以作为社会上计算机培训机构的教材。对所有想了解计算机操作系统,但又不需要或不打算深入学习其理论和实现细节的读者来说,本书是一本极具价值的入门指导书。一起来看看 《操作系统基础教程》 这本书的介绍吧!