@SuppressLint("InlinedApi")
  private void applyRules(View view, BoxElement elm) {
    int alignmentInBox = elm.getAlignmentInBox();
    int elmW = elm.getWidthCell();
    boolean bOverlapTB = false;
    boolean bOverlapLR = false;
    FrameLayout.LayoutParams lp = (LayoutParams) view.getLayoutParams();

    switch (alignmentInBox) {
      case DEFINE_BOX_ELEMENT_RULES_RIGHT_TOP:
        if (UIUtils.hasICS()) {
          lp.gravity = Gravity.END;
        } else {
          lp.gravity = Gravity.RIGHT | Gravity.TOP;
        }
        break;
      case DEFINE_BOX_ELEMENT_RULES_LEFT_BOTTOM:
        if (UIUtils.hasICS()) {
          lp.gravity = Gravity.START;
        } else {
          lp.gravity = Gravity.LEFT | Gravity.BOTTOM;
        }
        break;
      case DEFINE_BOX_ELEMENT_RULES_RIGHT_BOTTOM:
        if (UIUtils.hasICS()) {
          lp.gravity = Gravity.END;
        } else {
          lp.gravity = Gravity.RIGHT | Gravity.BOTTOM;
        }
        break;
      case DEFINE_BOX_ELEMENT_RULES_OVERLAP_TOP:
        bOverlapTB = true;
        lp.gravity = Gravity.TOP;
        break;
      case DEFINE_BOX_ELEMENT_RULES_OVERLAP_BOTTOM:
        bOverlapTB = true;
        lp.gravity = Gravity.BOTTOM;
        if (view instanceof TextView) {
          ((TextView) view).setGravity(Gravity.BOTTOM);
        }
        break;
      case DEFINE_BOX_ELEMENT_RULES_OVERLAP_LEFT:
        bOverlapLR = true;
        if (UIUtils.hasICS()) {
          lp.gravity = Gravity.START;
        }
        break;
      case DEFINE_BOX_ELEMENT_RULES_OVERLAP_RIGHT:
        bOverlapLR = true;
        if (UIUtils.hasICS()) {
          lp.gravity = Gravity.END;
        } else {
          lp.gravity = Gravity.RIGHT | Gravity.TOP;
        }
        break;
      case DEFINE_BOX_ELEMENT_RULES_STRETCH:
        lp.width = getBoxSupposeWidth();
        lp.height = getBoxSupposeHeight();
        break;
      case DEFINE_BOX_ELEMENT_RULES_LEFT_TOP:
      default:
        lp.gravity = Gravity.LEFT | Gravity.TOP;
        break;
    }

    if (bOverlapTB) {
      lp.width =
          mBoxCellSize * mNumberOfColumn + mMultiPaddingNum * (mNumberOfColumn - 1) * mGapWidth;
      if (mBoxLayoutIndex == 0) {
        lp.height =
            (mBoxCellSize * mNumberOfRow + mMultiPaddingNum * (mNumberOfRow - 1) * getPaddingTop())
                / 4;
      } else {
        lp.height =
            (int)
                ((2
                        * (mBoxCellSize * mNumberOfRow
                            + mMultiPaddingNum * (mNumberOfRow - 1) * getPaddingTop()))
                    / 5.5f);
      }
      // lp.height = (mBoxCellSize * mNumberOfRow + mMultiPaddingNum
      // * (mNumberOfRow - 1) * getPaddingTop()) / 3;
    } else if (bOverlapLR) {
      lp.width = mBoxCellSize * elmW + mMultiPaddingNum * (elmW - 1) * mGapWidth;
      lp.height =
          (mBoxCellSize * mNumberOfRow + mMultiPaddingNum * (mNumberOfRow - 1) * getPaddingTop());
    } else if (alignmentInBox != DEFINE_BOX_ELEMENT_RULES_STRETCH) {
      lp.width = mBoxCellSize * elmW + mMultiPaddingNum * (elmW - 1) * mGapWidth;
      lp.height = mBoxCellSize;
    }

    if ((view instanceof ImageView) && alignmentInBox != DEFINE_BOX_ELEMENT_RULES_STRETCH) {
      ((ImageView) view).setScaleType(ScaleType.FIT_XY);
      if (mNumberOfColumn > 1) {
        mNeedBackground = true;
      }
      // NOTE: image could be able to "eat" the padding in box.
      lp.width = mBoxCellSize * elmW + mMultiPaddingNum * (elmW) * mGapWidth;
    } else if (view instanceof TextView) {
      TextView tv = (TextView) view;
      if (TNPreferenceManager.isIgnoreTextGravity()) {
        tv.setGravity(Gravity.LEFT | Gravity.TOP);
      } else {
        tv.setGravity(lp.gravity);
      }
      // mWidthText = lp.width;
      // mHeightText = lp.height;
      tv.setPadding(mGapWidth, mGapWidth / 2, mGapWidth, mGapWidth);
    }

    view.setLayoutParams(lp);
    view.setVisibility(VISIBLE);
  }