void ofxFlashInteractiveObject :: _mouseDragged( int x, int y, int id ) { if( !_mouseEnabled ) return; // dispatch mouse drag - should dispatch first. if( hitTestPoint( x, y ) ) { if( !_mouseOver ) { _mouseOver = true; // dispatch mouse over } } else { if( _mouseOver ) { _mouseOver = false; // dispatch mouse out. if( _mouseUpOutside && _mouseDown ) { _mouseDown = false; // dispatch mouse up. } } } }
void InteractiveObject::handleEvent(const Event &event) { if (event.type == MouseEvent::MOUSE_MOVE || event.type == MouseEvent::CLICK || event.type == MouseEvent::MOUSE_DOWN || event.type == MouseEvent::MOUSE_UP) { MouseEvent* st = (MouseEvent*)(&event); bool hit = hitTestPoint(st->getX(), st->getY()); if (event.type == MouseEvent::MOUSE_MOVE) { onMouseMove(event); if (isHovered) { if (!hit) { onMouseOut(event); dispatchEvent(MouseEvent(this, MouseEvent::MOUSE_OUT, st->getX(), st->getY())); isHovered = !isHovered; } } else { if (hit) { onMouseOver(event); dispatchEvent(MouseEvent(this, MouseEvent::MOUSE_OVER, st->getX(), st->getY())); isHovered = !isHovered; } } } else if (hit) { dispatchEvent(MouseEvent(this, event.type, st->getX(), st->getY())); } } }
void ofxFlashInteractiveObject :: _mousePressed( int x, int y, int id ) { if( !_mouseEnabled ) return; if( hitTestPoint( x, y ) ) { if( !_mouseDown ) { _mouseDown = true; // dispatch mouse down. } } }
void ofxFlashInteractiveObject :: _mouseReleased( int x, int y, int id ) { if( !_mouseEnabled ) return; if( hitTestPoint( x, y ) ) { // dispatch mouse up inside. } else { if( _mouseDown ) { // dispatch mouse up outside. } } _mouseDown = false; }
bool RenderSVGText::nodeAtFloatPoint(const HitTestRequest& request, HitTestResult& result, const FloatPoint& pointInParent, HitTestAction hitTestAction) { PointerEventsHitRules hitRules(PointerEventsHitRules::SVG_TEXT_HITTESTING, request, style()->pointerEvents()); bool isVisible = (style()->visibility() == VISIBLE); if (isVisible || !hitRules.requireVisible) { if ((hitRules.canHitStroke && (style()->svgStyle()->hasStroke() || !hitRules.requireStroke)) || (hitRules.canHitFill && (style()->svgStyle()->hasFill() || !hitRules.requireFill))) { FloatPoint localPoint = localToParentTransform().inverse().mapPoint(pointInParent); if (!SVGRenderSupport::pointInClippingArea(this, localPoint)) return false; HitTestPoint hitTestPoint(LayoutPoint(flooredIntPoint(localPoint))); return RenderBlock::nodeAtPoint(request, result, hitTestPoint, LayoutPoint(), hitTestAction); } } return false; }
bool DisplayObject::acceptTouchEvent(TouchEvent &event) { if (!_mouseEnabled) { return false; } // 没有该事件并且也没有 TOUCH_OUT TOUCH_HIT RIGHT_MOUSE_CLICK MIDDLE_MOUSE_CLICK if (!hasEventListener(event.type) && !hasEventListener(TouchEvent::TOUCH_IN) && !hasEventListener(TouchEvent::TOUCH_OUT) && !hasEventListener(TouchEvent::TOUCH_HIT) && !hasEventListener(TouchEvent::RIGHT_MOUSE_CLICK) && !hasEventListener(TouchEvent::MIDDLE_MOUSE_CLICK) ) { return false; } // 多点触控 bool isIn = false; for (int i = 0; i < event.size; i++) { isIn = hitTestPoint(event.points[i].x, event.points[i].y); if (!isIn && event.size > 1) { // 多点触控,如果多点都未在显示对象内部,则视为未选中 _touchBegan = false; _touchIn = false; return false; } } // TOUCH_OUT事件 if (_touchIn && !isIn) { if (hasEventListener(TouchEvent::TOUCH_OUT)) { TouchEvent touchOutEvent(TouchEvent::TOUCH_OUT, true, event.points, event.size); dispatchEvent(touchOutEvent); _touchIn = false; _touchBegan = false; return true; // TOUCH_OUT事件,事件接受成功。 } } // TOUCH_IN事件 if (!_touchIn && isIn) { if (hasEventListener(TouchEvent::TOUCH_IN)) { TouchEvent touchInEvent(TouchEvent::TOUCH_IN, true, event.points, event.size); dispatchEvent(touchInEvent); } } // not in, 不派发事件 if (!isIn) { _touchIn = false; _touchBegan = false; return false; } // Touch_Began if (event.type == TouchEvent::TOUCH_BEGAN || event.type == TouchEvent::RIGHT_MOUSE_DOWN || event.type == TouchEvent::MIDDLE_MOUSE_DOWN) { _touchBegan = true; } // in 派发事件 dispatchEvent(event); // click事件 if (_touchBegan && event.type == TouchEvent::TOUCH_END && hasEventListener(TouchEvent::TOUCH_HIT)) { TouchEvent touchHitEvent(TouchEvent::TOUCH_HIT, true, event.points, event.size); dispatchEvent(touchHitEvent); } else if (_touchBegan && event.type == TouchEvent::RIGHT_MOUSE_UP && hasEventListener(TouchEvent::RIGHT_MOUSE_CLICK)) { TouchEvent rightClickEvnet(TouchEvent::RIGHT_MOUSE_CLICK, true, event.points, event.size); dispatchEvent(rightClickEvnet); } else if (_touchBegan && event.type == TouchEvent::MIDDLE_MOUSE_UP && hasEventListener(TouchEvent::MIDDLE_MOUSE_CLICK)) { TouchEvent middleClickEvent(TouchEvent::MIDDLE_MOUSE_CLICK, true, event.points, event.size); dispatchEvent(middleClickEvent); } _touchIn = true; return true; }
bool DisplayObject::hitTestPoint(const Point2D &point) { return hitTestPoint(point.x, point.y); }