1. 程式人生 > >android自定義view之測量父view和迭代測量子view

android自定義view之測量父view和迭代測量子view

@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
    int resWidth = 0;
    int resHeight = 0;
    int width = MeasureSpec.getSize(widthMeasureSpec);
    int widthMode = MeasureSpec.getMode(widthMeasureSpec);
    int height = MeasureSpec.getSize(heightMeasureSpec);
    int 
heightMode = MeasureSpec.getMode(heightMeasureSpec); if (widthMode != MeasureSpec.EXACTLY || heightMode != MeasureSpec.EXACTLY) { //如果不是精確值對應的處理 resWidth = getSuggestedMinimumWidth();//取背景圖的寬度 resWidth = resWidth == 0 ? getDefaultWidht() : resWidth; resHeight = getSuggestedMinimumHeight(); resHeight = resHeight == 0
? getDefaultWidht() : resHeight; } else { //如果是精確值,則取寬和高中值小的 resWidth = resHeight = Math.min(width, height); } setMeasuredDimension(resWidth, resHeight); //獲得半徑 mRadius = Math.max(getMeasuredWidth(), getMeasuredHeight()); //menu item個數 final int childCount = getChildCount(); //menu item 尺寸 int childSize = (int
) (mRadius * RADIO_DEFAULT_CHILD_DIMENSION); int childMode = MeasureSpec.EXACTLY; //迭代測量 for (int i = 0; i < childCount; i++) { final View child = getChildAt(i); if (child.getVisibility() == GONE) { continue; } //測量menu item int makeMeasureSpec = -1; if (child.getId() == R.id.id_circle_menu_item_center) { makeMeasureSpec = MeasureSpec.makeMeasureSpec((int) (mRadius * RADIO_DEFAULT_CENTERITEM_DIMENSION), childMode); } else { makeMeasureSpec = MeasureSpec.makeMeasureSpec(childSize, childMode); } child.measure(makeMeasureSpec, makeMeasureSpec); } mPadding = (int) (RADIO_PADDING_LAYOUT * mRadius); }