/**
  * Method that returns the target view for the current resize frame
  *
  * @return The target view
  */
 View findTargetFromResizeFrame() {
   int count = getChildCount();
   for (int i = 0; i < count; i++) {
     View v = getChildAt(i);
     if (v.getX() < (mResizeFrame.getX() + (mResizeFrame.getWidth() / 2))
         && (v.getX() + v.getWidth()) > (mResizeFrame.getX() + (mResizeFrame.getWidth() / 2))
         && v.getY() < (mResizeFrame.getY() + (mResizeFrame.getHeight() / 2))
         && (v.getY() + v.getHeight()) > (mResizeFrame.getY() + (mResizeFrame.getHeight() / 2))) {
       return v;
     }
   }
   return null;
 }
  @Override
  public void onResize(int mode, int delta) {
    if (mTarget == null) return;
    if (mResizeFrame == null) return;

    int w = getMeasuredWidth() - (getPaddingLeft() + getPaddingRight());
    int h = getMeasuredHeight() - (getPaddingTop() + getPaddingBottom());
    int minWidth = (w / mCols) + (w / mCols) / 2;
    int minHeight = (h / mRows) + (h / mRows) / 2;

    FrameLayout.LayoutParams params = (FrameLayout.LayoutParams) mResizeFrame.getLayoutParams();
    switch (mode) {
      case Gravity.LEFT:
        float newpos = mResizeFrame.getX() + delta;
        if ((delta < 0 && newpos < (getPaddingLeft() * -1))
            || (delta > 0 && newpos > (mResizeFrame.getX() + params.width - minWidth))) {
          return;
        }
        mResizeFrame.setX(newpos);
        params.width -= delta;
        break;
      case Gravity.RIGHT:
        if ((delta < 0 && ((params.width + delta) < minWidth))
            || (delta > 0
                && (mResizeFrame.getX() + delta + params.width)
                    > (getPaddingLeft() + getMeasuredWidth()))) {
          return;
        }
        params.width += delta;
        break;
      case Gravity.TOP:
        newpos = mResizeFrame.getY() + delta;
        if ((delta < 0 && newpos < (getPaddingTop() * -1))
            || (delta > 0 && newpos > (mResizeFrame.getY() + params.height - minHeight))) {
          return;
        }
        mResizeFrame.setY(newpos);
        params.height -= delta;
        break;
      case Gravity.BOTTOM:
        if ((delta < 0 && ((params.height + delta) < minHeight))
            || (delta > 0
                && (mResizeFrame.getY() + delta + params.height)
                    > (getPaddingTop() + getMeasuredHeight()))) {
          return;
        }
        params.height += delta;
        break;

      default:
        break;
    }
    mResizeFrame.setLayoutParams(params);
  }
  /**
   * Method that converts the resize frame to a dispostion reference
   *
   * @return Disposition The disposition reference
   */
  private Disposition resizerToDisposition() {
    int w = getMeasuredWidth() - (getPaddingLeft() + getPaddingRight());
    int h = getMeasuredHeight() - (getPaddingTop() + getPaddingBottom());
    int cw = w / mCols;
    int ch = h / mRows;

    // Remove overlapped areas
    Disposition resizer = new Disposition();
    resizer.x = Math.round(mResizeFrame.getX() / cw);
    resizer.y = Math.round(mResizeFrame.getY() / ch);
    resizer.w = Math.round(mResizeFrame.getWidth() / cw);
    resizer.h = Math.round(mResizeFrame.getHeight() / ch);

    // Fix disposition (limits)
    resizer.x = Math.max(resizer.x, 0);
    resizer.y = Math.max(resizer.y, 0);
    resizer.w = Math.min(resizer.w, mCols - resizer.x);
    resizer.h = Math.min(resizer.h, mRows - resizer.y);

    return resizer;
  }