@Override
  protected void onMeasure(int widthSpec, int heightSpec) {
    // Measure all children.
    int freeSpec = MeasureSpec.makeMeasureSpec(0, MeasureSpec.UNSPECIFIED);
    mShutterButton.measure(freeSpec, freeSpec);
    mIndicatorControlWheel.measure(freeSpec, freeSpec);
    mZoomControlWheel.measure(freeSpec, freeSpec);

    // Measure myself. Add some buffer for highlight arc.
    int desiredWidth =
        mShutterButton.getMeasuredWidth() + IndicatorControlWheel.HIGHLIGHT_WIDTH * 4;
    int desiredHeight =
        mShutterButton.getMeasuredHeight() + IndicatorControlWheel.HIGHLIGHT_WIDTH * 4;
    int widthMode = MeasureSpec.getMode(widthSpec);
    int heightMode = MeasureSpec.getMode(heightSpec);
    int measuredWidth, measuredHeight;
    if (widthMode == MeasureSpec.UNSPECIFIED) {
      measuredWidth = desiredWidth;
    } else if (widthMode == MeasureSpec.AT_MOST) {
      measuredWidth = Math.min(desiredWidth, MeasureSpec.getSize(widthSpec));
    } else { // MeasureSpec.EXACTLY
      measuredWidth = MeasureSpec.getSize(widthSpec);
    }
    if (heightMode == MeasureSpec.UNSPECIFIED) {
      measuredHeight = desiredHeight;
    } else if (heightMode == MeasureSpec.AT_MOST) {
      measuredHeight = Math.min(desiredHeight, MeasureSpec.getSize(heightSpec));
    } else { // MeasureSpec.EXACTLY
      measuredHeight = MeasureSpec.getSize(heightSpec);
    }
    setMeasuredDimension(measuredWidth, measuredHeight);
  }