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