Android Touch事件的分发过程
来源:互联网 发布:各国语言翻译软件 编辑:程序博客网 时间:2024/05/20 07:34
最近项目重要到了大量的触摸手势等事件的处理,iOS做完了,android同事遇到问题,于是查阅了相关Android motionEvent资料,故转载,留备以后继续查看:
事实上DecorView的dispatchTouchEvent会先调用Activity的dispatchTouchEvent,代码如下:
- @Override
-
public boolean dispatchTouchEvent(MotionEvent ev) { -
// Stylus events with side button pressed are filtered and other -
// events are processed normally. -
if (mEnableGestures -
&& MotionEvent.BUTTON_SECONDARY == ev.getButtonState()) { -
mStylusFilter.onTouchEvent(ev); -
return false; -
} -
final Callback cb = getCallback(); -
return cb null!= && 0!isDestroyed() && mFeatureId < ? cb.dispatchTouchEvent(ev) -
: super.dispatchTouchEvent(ev); -
}
Callback cb实际上是一个Activity引用,它是在Activity的attach方法被调用的时候通过mWindow.setCallback(this)将自身的引用给设置到Window类的mCallback成员变量中去的,这样在PhoneWindow这个子类中通过getCallback()方法得到的其实是Window所关联的Activity对象。因此这里会先调用Activity的dispatchTouchEvent方法(暂时忽略其他判断条件),Activity的dispatchTouchEvent()方法代码如下,很简单:
-
-
public boolean dispatchTouchEvent(MotionEvent ev) { -
if (ev.getAction() == MotionEvent.ACTION_DOWN) { -
onUserInteraction(); -
} -
if (getWindow().superDispatchTouchEvent(ev)) { -
return true; -
} -
return onTouchEvent(ev); -
}
它的getWindow()实际上引用的是PhoneWindow对象,又调用到了DecorView的superDispatchTouchEvent方法,而这个方法的作用就是上面所说的在View层次中进行事件的分发,如果有任何一个子视图处理了该事件,那么Activity的dispatchTouchEvent方法就返回true,否则会调用Activity的onTouchEvent方法。
注释上的说法是可以重写Activity的dispatchTouchEvent方法从而在分发事件之前拦截住所有事件。
- final
float offsetX = mScrollX - child.mLeft; - final
float offsetY = mScrollY - child.mTop; - event.offsetLocation(offsetX,
offsetY); -
- handled
= child.dispatchTouchEvent(event); -
- event.offsetLocation(-offsetX,
-offsetY);
就保证了子视图显示位置发生变化以后,触屏坐标也相应的跟着变化。这点会对某些ViewGroup计算子视图实际触屏位置有影响,比如ViewGroup的(x,y)处被点击了,要想知道该点有没有落在某个子视图内,需要判断(x + getScrollX() , y + getScrollY()) 这个点有没有处于子视图的矩形范围内,如果处于则表示子视图也被点击,可以处理该事件。
- Android Touch事件的分发过程
- Android Touch事件的分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程
- Android Touch事件分发过程详解
- Android Touch事件分发过程详解
- Android Touch事件分发过程详解
- Android Touch事件分发过程详解
- View的touch事件分发过程
- Android Touch分发事件
- Android Touch事件分发
- 巧用nc命令搭建http请求调试工具
- HDUOJ入门
- vsphere 忘记vcenter的Administrator@vsphere.local密码的解决办法
- 编译器实践三 之 针对算术表达式的语法分析器
- CentOS yum 源的配置与使用
- Android Touch事件的分发过程
- 32. Longest Valid Parentheses
- .net实现webservice简单实例分享
- HDU 2181 哈密顿绕行世界问题解法
- 路由器MTU值对于网络通讯的影响
- 移动web开发,12个触摸及多点触摸事件常用Js插件
- Samsung LCD接口篇
- UDP套接字
- Java语言实现简易计算器(1)界面