handleEvent method

  1. @override
bool handleEvent(
  1. SpriteBoxEvent event
)
override

Handles an event, such as a pointer (touch or mouse) event.

Override this method to handle events. The node will only receive events if the userInteractionEnabled property is set to true and the isPointInside method returns true for the position of the pointer down event (default behavior provided by NodeWithSize). Unless handleMultiplePointers is set to true, the node will only receive events for the first pointer that is down.

Return true if the node has consumed the event, if an event is consumed it will not be passed on to nodes behind the current node.

// MyTouchySprite gets transparent when we touch it
class MyTouchySprite extends Sprite {

  MyTouchySprite(Image img) : super (img) {
    userInteractionEnabled = true;
  }

  bool handleEvent(SpriteBoxEvent event) {
    if (event.type == PointerEventType.down) {
      opacity = 0.5;
    }
    else if (event.type == PointerEventType.up) {
      opacity = 1.0;
    }
    return true;
  }
}

Implementation

@override
bool handleEvent(SpriteBoxEvent event) {
  if (arrowKeyPressed) {
    return true;
  }

  if (event.type == PointerEventType.down) {
    _pointerDownAt = event.boxPosition;
    motions.stopAll();
    _isDown = true;
  } else if (event.type == PointerEventType.up ||
      event.type == PointerEventType.cancel) {
    _pointerDownAt = null;
    _value = Offset.zero;
    MotionTween moveToCenter = MotionTween(
      setter: (a) => _handlePos = a,
      start: _handlePos,
      end: _center,
      duration: 0.4,
      curve: Curves.elasticOut,
    );
    motions.run(moveToCenter);
    _isDown = false;
  } else if (event.type == PointerEventType.move && _isDown) {
    Offset movedDist = event.boxPosition - _pointerDownAt!;

    _value = Offset((movedDist.dx / 80.0).clamp(-1.0, 1.0),
        (movedDist.dy / 80.0).clamp(-1.0, 1.0));

    _handlePos = _center! + Offset(_value.dx * 40.0, _value.dy * 40.0);
  }
  return true;
}