@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; } }