code: protected boolean onLayout() {
          boolean changed = isChanged();
          boolean runLayout = false;
          Log.d(Log.SUBSYSTEM.LAYOUT, TAG, "onLayout() called (%s) mChanged = %b ", getName(), changed);
  
          FPSCounter.timeCheck("onLayout <START>: " + this + "<" + getName() + "> changed = " + changed);
  
          float oldWidth = getLayoutWidth();
          float oldHeight = getLayoutHeight();
          float oldDepth = getLayoutDepth();
  
          for (Widget child : getChildren()) {
              if (child.layout()) {
                  invalidateAllLayouts();
                  runLayout = true;
              }
          }
  
          if (mLayouts == null || mLayouts.isEmpty()) {
              Log.d(Log.SUBSYSTEM.LAYOUT, TAG, "onLayout: no layouts applied %s!", getName());
          } else if (runLayout || changed) {
  
              for (Layout layout : mLayouts) {
                  measureLayout(layout);
                  layout.layoutChildren();
              }
  
              float newWidth = getLayoutWidth();
              float newHeight = getLayoutHeight();
              float newDepth = getLayoutDepth();
  
              changed = changed ||
                      !equal(oldWidth, newWidth) ||
                      !equal(oldHeight, newHeight) ||
                      !equal(oldDepth, newDepth);
  
              Log.d(Log.SUBSYSTEM.LAYOUT, TAG, "onLayout: layout changed %s " +
                              "old = [%f, %f, %f] new [%f, %f, %f]!",
  
                      getName(), oldWidth, oldHeight, oldDepth, newWidth, newHeight, newDepth);
          } else {
              Log.d(Log.SUBSYSTEM.LAYOUT, TAG, "onLayout: layout is not changed %s!", getName());
          }
  
          FPSCounter.timeCheck("onLayout <END>: " + this + "<" + getName() + "> changed = " + changed);
          return changed;
      }
docs: Hook method for handling layout events. For {@link GroupWidget} in
  particular, this is where layout of children is done.
  {@code GroupWidgets} should call {@link #layout()} on their children,
  most likely before performing their own layout <em>of</em> their
  children.
  @return true if the widget has been relaidout, otherwise - false