computeBounds method

  1. @override
Bounds computeBounds(
  1. SkeletonDrawableFlutter drawable
)
override

Implementation

@override
Bounds computeBounds(SkeletonDrawableFlutter drawable) {
  final data = drawable.skeletonData;
  final oldSkin = drawable.skeleton.skin;
  final customSkin = Skin("custom-skin");
  for (final skinName in skins) {
    final skin = data.findSkin(skinName);
    if (skin == null) continue;
    customSkin.addSkin(skin);
  }
  drawable.skeleton.setSkin2(customSkin);
  drawable.skeleton.setupPose();

  final animation = this.animation != null ? data.findAnimation(this.animation!) : null;
  double minX = double.infinity;
  double minY = double.infinity;
  double maxX = double.negativeInfinity;
  double maxY = double.negativeInfinity;
  if (animation == null) {
    drawable.skeleton.updateWorldTransform(Physics.none);
    final bounds = drawable.skeleton.bounds;
    minX = bounds.x;
    minY = bounds.y;
    maxX = minX + bounds.width;
    maxY = minY + bounds.height;
  } else {
    drawable.animationState.setAnimation(0, animation.name, false);
    final steps = max(animation.duration / stepTime, 1.0).toInt();
    for (int i = 0; i < steps; i++) {
      drawable.update(i > 0 ? stepTime : 0);
      drawable.skeleton.updateWorldTransform(Physics.none);
      final bounds = drawable.skeleton.bounds;
      minX = min(minX, bounds.x);
      minY = min(minY, bounds.y);
      maxX = max(maxX, minX + bounds.width);
      maxY = max(maxY, minY + bounds.height);
    }
  }
  drawable.skeleton.setSkin("default");
  drawable.animationState.clearTracks();
  if (oldSkin != null) drawable.skeleton.setSkin2(oldSkin);
  drawable.skeleton.setupPose();
  drawable.update(0);
  customSkin.dispose();
  return Bounds(x: minX, y: minY, width: maxX - minX, height: maxY - minY);
}