content: package com.mingle.widget;
  
  import android.annotation.TargetApi;
  import android.content.Context;
  import android.content.res.TypedArray;
  import android.os.Build;
  import android.util.AttributeSet;
  import android.view.MotionEvent;
  import android.view.ViewGroup;
  import android.widget.RelativeLayout;
  
  import com.mingle.sweetsheet.R;
  
  
  /**
   * @author zzz40500
   * @version 1.0
   * @date 2015/8/8.
   * @github: https://github.com/zzz40500
   *
   */
  public class FreeGrowUpParentRelativeLayout extends RelativeLayout implements GrowUpParent {
  
  
      private float downY;
      private int originalHeight = -1;
  
      private int parentHeight;
      private int currentHeight;
  
  
      private boolean isGrowUp = true;
  
      private int mOffset =-1;
  
      public FreeGrowUpParentRelativeLayout(Context context) {
          super(context);
      }
  
      public FreeGrowUpParentRelativeLayout(Context context, AttributeSet attrs) {
          super(context, attrs);
          init(attrs);
      }
  
      private void init(AttributeSet attrs) {
  
          TypedArray typedArray=getContext().obtainStyledAttributes(attrs,
                  R.styleable.FreeGrowUpParentRelativeLayout);
          mOffset=  typedArray.getDimensionPixelOffset(R.styleable.FreeGrowUpParentRelativeLayout_offset,-1);
          typedArray.recycle();
      }
  
      public FreeGrowUpParentRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr) {
          super(context, attrs, defStyleAttr);
      }
  
      @TargetApi(Build.VERSION_CODES.LOLLIPOP)
      public FreeGrowUpParentRelativeLayout(Context context, AttributeSet attrs, int defStyleAttr, int defStyleRes) {
          super(context, attrs, defStyleAttr, defStyleRes);
      }
  
  
      private boolean checkGrowUpEnable() {
          if (getParent() != null && getParent() instanceof ViewGroup && isGrowUp) {
              parentHeight = ((ViewGroup) getParent()).getHeight();
              return true;
          } else {
              return false;
          }
      }
  
  
  
      @Override
      public boolean onTouchEvent(MotionEvent event) {
  
          return super.onTouchEvent(event);
      }
  
      private void setOriginalHeight() {
          if (originalHeight == -1) {
              originalHeight = getHeight();
          }
          currentHeight = getHeight();
      }
  
      private void changeLayoutParamsHeight(int distance) {
          ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
          int height= Math.min(currentHeight + distance, parentHeight+mOffset);
  
          if(height <originalHeight){
  //            height= (int) (originalHeight-(originalHeight-height)*0.05);
              height= originalHeight;
          }
          layoutParams.height =height;
          requestLayout();
      }
  
      public boolean isGrowUp() {
          return isGrowUp;
      }
  
      public void setIsGrowUp(boolean isGrowUp) {
          this.isGrowUp = isGrowUp;
      }
  
      public void reset() {
  
          if (originalHeight != -1) {
              ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
              layoutParams.height = originalHeight;
              requestLayout();
          }
      }
  
      @Override
      public boolean onParentHandMotionEvent(MotionEvent event) {
  
          switch (event.getAction()) {
              case MotionEvent.ACTION_DOWN:
  
                  if (!checkGrowUpEnable()) {
                      return false;
                  }
                  downY = event.getRawY();
                  setOriginalHeight();
                  break;
  
              case MotionEvent.ACTION_MOVE:
                  int distance = (int) (downY - event.getRawY());
                  changeLayoutParamsHeight(distance);
                  break;
              case MotionEvent.ACTION_UP:
              case MotionEvent.ACTION_CANCEL:
  
                  break;
          }
          return true;
      }
  
      public void setContentHeight(int contentHeight){
  
          originalHeight=-1;
          ViewGroup.LayoutParams layoutParams = this.getLayoutParams();
          layoutParams.height = contentHeight+getContext().getResources().getDimensionPixelOffset(R.dimen.arc_max_height);
  
          requestLayout();
  
  
      }
  
  }
  