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.
			}
		}
	}
}
示例#2
0
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;
}
示例#5
0
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);
}