private void layoutItems(List<PieItem> items, float centerAngle, int inner, int outer, int gap) {
   float emptyangle = PIE_SWEEP / 16;
   float sweep = (float) (PIE_SWEEP - 2 * emptyangle) / items.size();
   float angle = centerAngle - PIE_SWEEP / 2 + emptyangle + sweep / 2;
   // check if we have custom geometry
   // first item we find triggers custom sweep for all
   // this allows us to re-use the path
   for (PieItem item : items) {
     if (item.getCenter() >= 0) {
       sweep = item.getSweep();
       break;
     }
   }
   Path path = makeSlice(getDegrees(0) - gap, getDegrees(sweep) + gap, outer, inner, mCenter);
   for (PieItem item : items) {
     // shared between items
     item.setPath(path);
     if (item.getCenter() >= 0) {
       angle = item.getCenter();
     }
     int w = item.getIntrinsicWidth();
     int h = item.getIntrinsicHeight();
     // move views to outer border
     int r = inner + (outer - inner) * 2 / 3;
     int x = (int) (r * Math.cos(angle));
     int y = mCenter.y - (int) (r * Math.sin(angle)) - h / 2;
     x = mCenter.x + x - w / 2;
     item.setBounds(x, y, x + w, y + h);
     float itemstart = angle - sweep / 2;
     item.setGeometry(itemstart, sweep, inner, outer);
     if (item.hasItems()) {
       layoutItems(item.getItems(), angle, inner, outer + mRadiusInc / 2, gap);
     }
     angle += sweep;
   }
 }