虚拟 Group

在spritjs中,用Group给精灵元素分组,对分组的元素进行统一的transform操作是一个很棒的方法。Group还可以嵌套,以形成多层树状的结构,这样就使得我们可以有能力用精灵来构造复杂的UI组件。

对于普通的Group元素,它本身的contentSize为[0, 0],并且不具有普通元素的盒模型。这样的Group是虚拟元素,被称为Virtual Group,我们可以通过group.isVirtual判断一个Group元素是否是Virtual的。

当一个Group具有anchor(非[0,0])、size(非[0,0])、borderWidth(非0)、borderRadius(非0)、bgcolor(非'')属性之一时,它就成为一个有盒模型的真正的元素,不再是Virtual的了,这也就意味着给Group设置这些属性之后,Group就成为有边界的元素了。

虚拟 Group - 图1

让一个Group成为普通元素,在某些情况下是比较好的做法,比如一个group中有很多静止的子元素,我们可以通过给group设置size,让它能够变成一个可被正常缓存的普通元素,通过缓存来提升性能。另一方面,group的box也会带来一些额外的性能开销,所以要权衡选择。

  1. const scene = new Scene('#virtualgroup', {viewport: ['auto', 'auto'], resolution: [1540, 600]});
  2. const layer = scene.layer();
  3. const g1 = new Group(); // virtual group
  4. g1.attr({
  5. pos: [500, 200],
  6. rotate: 45,
  7. });
  8. layer.append(g1);
  9. const c1 = new Sprite();
  10. c1.attr({
  11. pos: [0, 0],
  12. size: [80, 80],
  13. borderRadius: 40,
  14. bgcolor: 'red',
  15. });
  16. const c2 = c1.cloneNode();
  17. c2.attr({
  18. x: x => x + 100,
  19. bgcolor: 'blue',
  20. });
  21. const c3 = c1.cloneNode();
  22. c3.attr({
  23. y: y => y + 100,
  24. bgcolor: 'green',
  25. });
  26. g1.append(c1, c2, c3);
  27. const g2 = g1.cloneNode(true);
  28. g2.attr({
  29. pos: [1000, 200],
  30. rotate: 45,
  31. size: [150, 150],
  32. padding: 10,
  33. bgcolor: 'grey',
  34. });
  35. layer.append(g2);