code: private void pullGlows(int overscrollX, int overscrollY) {
          if (overscrollX < 0) {
              if (mLeftGlow == null) {
                  mLeftGlow = new EdgeEffectCompat(getContext());
                  mLeftGlow.setSize(getMeasuredHeight() - getPaddingTop() - getPaddingBottom(),
                          getMeasuredWidth() - getPaddingLeft() - getPaddingRight());
              }
              mLeftGlow.onPull(-overscrollX / (float) getWidth());
          } else if (overscrollX > 0) {
              if (mRightGlow == null) {
                  mRightGlow = new EdgeEffectCompat(getContext());
                  mRightGlow.setSize(getMeasuredHeight() - getPaddingTop() - getPaddingBottom(),
                          getMeasuredWidth() - getPaddingLeft() - getPaddingRight());
              }
              mRightGlow.onPull(overscrollX / (float) getWidth());
          }
  
          if (overscrollY < 0) {
              if (mTopGlow == null) {
                  mTopGlow = new EdgeEffectCompat(getContext());
                  mTopGlow.setSize(getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
                          getMeasuredHeight() - getPaddingTop() - getPaddingBottom());
              }
              mTopGlow.onPull(-overscrollY / (float) getHeight());
          } else if (overscrollY > 0) {
              if (mBottomGlow == null) {
                  mBottomGlow = new EdgeEffectCompat(getContext());
                  mBottomGlow.setSize(getMeasuredWidth() - getPaddingLeft() - getPaddingRight(),
                          getMeasuredHeight() - getPaddingTop() - getPaddingBottom());
              }
              mBottomGlow.onPull(overscrollY / (float) getHeight());
          }
  
          if (overscrollX != 0 || overscrollY != 0) {
              ViewCompat.postInvalidateOnAnimation(this);
          }
      }
docs: Apply a pull to relevant overscroll glow effects