code: public final void smoothScrollBy(int dx, int dy) {
  		if (getChildCount() == 0) {
  			// Nothing to do.
  			return;
  		}
  		long duration = AnimationUtils.currentAnimationTimeMillis() - mLastScroll;
  		if (duration > ANIMATED_SCROLL_GAP) {
  			final int height = getHeight() - getPaddingBottom() - getPaddingTop();
  			final int bottom = getChildAt(0).getHeight();
  			final int maxY = Math.max(0, bottom - height);
  			final int scrollY = getScrollY();
  			dy = Math.max(0, Math.min(scrollY + dy, maxY)) - scrollY;
  
  			mScroller.startScroll(getScrollX(), scrollY, 0, dy);
  			ViewCompat.postInvalidateOnAnimation(this);
  		} else {
  			if (!mScroller.isFinished()) {
  				mScroller.abortAnimation();
  			}
  			scrollBy(dx, dy);
  		}
  		mLastScroll = AnimationUtils.currentAnimationTimeMillis();
  	}
docs: Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
  
  @param dx the number of pixels to scroll by on the X axis
  @param dy the number of pixels to scroll by on the Y axis