Jndroid今日发布0.9.0版本,此版本较之上个版本最大的改进在于引入了Android事件处理流程,实现了MotionEvent一整套分发体系。这套体系拓展了传统前端的事件处理能力,从而可以实现许多只有在客户端上才能实现的交互方式。

如下图中的例子,蓝色矩形为屏幕范围。屏幕中为一个Gallery,Gallery有3屏,可以左右滑动。Gallery的中屏是一个ScrollView,其中有若干ScrollView Item。ScrollView可以上下滑动,ScrollView Item可以点击。

图片描述

这种交互在客户端中非常普遍,比如微信,比如各大浏览器,都是使用这种交互。然而在前端应用中,这种交互却非常罕见,主要的原因就在于传统前端事件处理方式无法处理这种复杂事件逻辑,具体说来,原因有二:

其一,前端中的事件处理过程是流式的,事件依次下发,依次冒泡。如果视图树中的节点对于事件处理的依赖是单向的,则这种流式的事件处理方式完全可以胜任。但是,如果依赖关系成环,(就Gallery而言,Gallery的子节点可能包含另外一个Gallery,那么,Gallery中的子节点是否能够接收到事件取决与Gallery是否予以分发,同时,Gallery自身是否应该处理事件又取决于子节点是否需要事件),则流式的处理方式则无法胜任。

其二,前端中的手势是集中判断的方式。如上例,当事件产生时,这些事件应为何种手势,是横向滑动,是竖向滑动,抑或是点击,则依赖于浏览器内核的判断。如果视图树很复杂,事件又很复杂,复杂度过高时,则浏览器内核无法周全,同时不同浏览器内核处理无法保证相同,便会产生各种问题。

为此,Jndroid中引入Android事件处理方式,可以解决上述两个问题。Jndroid中事件在下发与冒泡外,还加入了onInterceptTouchEvent方法,从而可以处理事件的环状依赖关系,同时,Jndroid中手势的判断逻辑在各个View中,没有手势的集中判断,因此大大降低了手势判断的复杂度。对于Jndroid中手势的分发流程和方法,当然同样也是Android事件分发流程,简要说明如下:

dispatchTouchEvent
向子节点分发事件。在此方法中,首先调用自己的onInterceptTouchEvent,如果不需要拦截,则利用ACTION_DOWN事件对子节点进行探查,找到需要接收事件的子节点并向其分发事件,如果没有找到,则调用自己的onTouchEvent方法。

onInterceptTouchEvent
预先对事件进行分析和处理,返回true,则事件不向子节点进行分发,返回false,则可以向子节点进行事件分发。以Gallery为例,Gallery在滑动过程中,返回值为true,而在静止时,返回值为false。

onTouchEvent
View自身对事件的处理。如Gallery中对滑动的处理。

requestDisallowInterceptTouchEvent
如果设置为true,其通知父节点和祖先节点皆不能拦截其事件。例如Gallery的onInterceptTouchEvent方法中会调用此方法,这样,两层Gallery嵌套时,滑动子Gallery时父Gallery就可以保持不动。

至此,一整套事件的处理体系就建立起来了,这套体系较之传统的内核事件处理体系具有更强的处理能力,同时兼容性更好,效率也更高,我们也因此可以利用Jndroid做出如微信这般交互的前端页面来,让Webapp拥有更广泛的应用空间。


绿茶浏览器
85 声望2 粉丝

好玩、梦想改变世界的小团队!