参数event描写叙述的手势操作被收集在FilteredGestureProvider类的成员变量pending_gesture_packet_描写叙述的一个Gesture Event Data Packet中。从前面的分析能够知道,这个Gesture Event Data Packet的类型为GestureEventDataPacket::TOUCH_MOVE。
假设当前正在处理的FilteredGestureProvider对象的成员变量handling_event_的值不等于true,那么FilteredGestureProvider类的成员函数OnGestureEvent将会直接将参数event描写叙述的手势操作发送给Render进程,这是通过调用另外一个成员变量gesture_filter_描写叙述的一个TouchDispositionGestureFilter对象的成员函数OnGesturePacket实现的。后面我们再分析这个发送过程。
这一步运行完毕后。Browser进程就对当前发生的Touch事件进行了滑动手势检测,而且检测到的滑动手势操作已经保存在一个Gesture Event Data Packet中。回到前面分析的GestureProvider类的成员函数OnTouchEvent中,接下来它会继续调用另外一个成员变量scale_gesture_listener_指向的是ScaleGestureListenerImpl对象的成员函数OnTouchEvent检测当前发生的Touch事件是否产生了捏合手势操作。
假设产生了,那么相同将它收集在上述的Gesture Event Data Packet中。
接下来我们就继续分析捏合手势操作的检测过程,也就是ScaleGestureListenerImpl类的成员函数OnTouchEvent的实现,例如以下所看到的:
class GestureProvider::ScaleGestureListenerImpl
: public ScaleGestureDetector::ScaleGestureListener {
public:
......
bool OnTouchEvent(const MotionEvent& event) {
......
bool handled = scale_gesture_detector_.OnTouchEvent(event);
......
return handled;
}
......
private:
......
ScaleGestureDetector scale_gesture_detector_;
......
}; 这个函数定义在文件external/chromium_org/ui/events/gesture_detection/gesture_provider.cc中。
ScaleGestureListenerImpl类的成员函数OnTouchEvent主要是调用成员变量scale_gesture_detector_描写叙述的一个ScaleGestureDetector对象的成员函数OnTouchEvent检测参数event描写叙述的Touch事件是否产生捏合手势操作。
ScaleGestureDetector类的成员函数OnTouchEvent的实现例如以下所看到的:
bool ScaleGestureDetector::OnTouchEvent(const MotionEvent& event) {
......
const int action = event.GetAction();
......
// Span is the average distance between touch points through the focal point;
// i.e. the diameter of the circle with a radius of the average deviation from
// the focal point.
const float span_x = dev_x * 2;
const float span_y = dev_y * 2;
float span;
if (InDoubleTapMode()) {
span = span_y;
} else {
span = std::sqrt(span_x * span_x + span_y * span_y);
}
......
const float min_span = InDoubleTapMode() ? span_slop_ : min_span_;
if (!in_progress_ && span >= min_span && (InDoubleTapMode() || count > 1) &&
(was_in_progress || std::abs(span - initial_span_) > span_slop_)) {
......
in_progress_ = listener_->OnScaleBegin(*this, event);
}
// Handle motion; focal point and span/scale factor are changing.
if (action == MotionEvent::ACTION_MOVE) {
......
if (in_progress_) {
update_prev = listener_->OnScale(*this, event);
}
......
}
return true;
}
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-81055-13.html
加油加油
雷军
自投罗网