no route to host Chromium网页输入事件捕捉和手势检测过程分析(6)

电脑杂谈  发布时间:2018-02-16 22:46:44  来源:网络整理

我们假设Render进程注册了处理Touch事件的Handler。

在这样的情况下。RenderWidgetHostViewAndroid类的成员函数OnTouchEvent就会调用函数CreateWebTouchEventFromMotionEvent将参数event描写叙述的Touch事件封装成一个blink::WebTouchEvent对象,而且调用另外一个成员函数SendTouchEvent将该blink::WebTouchEvent对象发送给Render进程处理。注意,这个blink::WebTouchEvent对象描写叙述的是原始的Touch事件,它不是一个手势操作。

接下来,我们先分析FilteredGestureProvider类的成员函数OnTouchEvent检测手势操作的过程,接着再分析函数CreateWebTouchEventFromMotionEvent创建blink::WebTouchEvent对象的过程,以及RenderWidgetHostViewAndroid类的成员函数SendTouchEvent向Render进程发送Touch事件的过程。

FilteredGestureProvider类的成员函数OnTouchEvent的实现例如以下所看到的:

bool FilteredGestureProvider::OnTouchEvent(const MotionEvent& event) {
  DCHECK(!handling_event_);
  base::AutoReset<bool> handling_event(&handling_event_, true);

  pending_gesture_packet_ = GestureEventDataPacket::FromTouch(event);

  if (!gesture_provider_.OnTouchEvent(event))
    return false;

  TouchDispositionGestureFilter::PacketResult result =
      gesture_filter_.OnGesturePacket(pending_gesture_packet_);
  if (result != TouchDispositionGestureFilter::SUCCESS) {
    NOTREACHED() << "Invalid touch gesture sequence detected.";
    return false;
  }

  return true;
}
这个函数定义在文件external/chromium_org/ui/events/gesture_detection/filtered_gesture_provider.cc中。

FilteredGestureProvider类的成员函数OnTouchEvent首先将成员变量handling_event_的值设置为true,表示当前正处于收集手势操作的过程中。不要将正在收集的手势操作发送给Render进程处理。而是等到全部收集完毕再一起发送给Render进程处理。

注意,当FilteredGestureProvider类的成员函数OnTouchEvent的调用结束后,FilteredGestureProvider类的成员变量handling_event的值将自己主动恢复为false。


本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-81055-6.html

相关阅读
    发表评论  请自觉遵守互联网相关的政策法规,严禁发布、暴力、反动的言论

    • 石敦夫
      石敦夫

      不管击沉撞沉拦截还是其他方法一定要强硬

    • 张良器
      张良器

      桃子加油

    热点图片
    拼命载入中...