@Override
 public void onDraw(Canvas canvas) {
   float alpha = 1;
   if (mXFade != null) {
     alpha = mXFade.getValue();
   } else if (mFadeIn != null) {
     alpha = mFadeIn.getValue();
   }
   int state = canvas.save();
   if (mFadeIn != null) {
     float sf = 0.9f + alpha * 0.1f;
     canvas.scale(sf, sf, mCenter.x, mCenter.y);
   }
   drawFocus(canvas);
   if (mState == STATE_FINISHING) {
     canvas.restoreToCount(state);
     return;
   }
   if ((mOpenItem == null) || (mXFade != null)) {
     // draw base menu
     for (PieItem item : mItems) {
       drawItem(canvas, item, alpha);
     }
   }
   if (mOpenItem != null) {
     for (PieItem inner : mOpenItem.getItems()) {
       drawItem(canvas, inner, (mXFade != null) ? (1 - 0.5f * alpha) : 1);
     }
   }
   canvas.restoreToCount(state);
 }
 /**
  * @param polar x: angle, y: dist
  * @return the item at angle/dist or null
  */
 private PieItem findItem(PointF polar) {
   // find the matching item:
   List<PieItem> items = (mOpenItem != null) ? mOpenItem.getItems() : mItems;
   for (PieItem item : items) {
     if (inside(polar, item)) {
       return item;
     }
   }
   return null;
 }
 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;
   }
 }