code: void smoothScrollTo(int x, int y, int velocity) {
          if (getChildCount() == 0) {
              // Nothing to do.
              setScrollingCacheEnabled(false);
              return;
          }
          int sx = getScrollX();
          int sy = getScrollY();
          int dx = x - sx;
          int dy = y - sy;
          if (dx == 0 && dy == 0) {
              completeScroll(false);
              populate();
              setScrollState(SCROLL_STATE_IDLE);
              return;
          }
  
          setScrollingCacheEnabled(true);
          setScrollState(SCROLL_STATE_SETTLING);
  
          final int height = getClientHeight();
          final int halfHeight = height / 2;
          final float distanceRatio = Math.min(1f, 1.0f * Math.abs(dx) / height);
          final float distance = halfHeight + halfHeight *
                  distanceInfluenceForSnapDuration(distanceRatio);
  
          int duration = 0;
          velocity = Math.abs(velocity);
          if (velocity > 0) {
              duration = 4 * Math.round(1000 * Math.abs(distance / velocity));
          } else {
              final float pageHeight = height * mAdapter.getPageWidth(mCurItem);
              final float pageDelta = (float) Math.abs(dx) / (pageHeight + mPageMargin);
              duration = (int) ((pageDelta + 1) * 100);
          }
          duration = Math.min(duration, MAX_SETTLE_DURATION);
  
          mScroller.startScroll(sx, sy, dx, dy, duration);
          ViewCompat.postInvalidateOnAnimation(this);
      }
docs: Like {@link View#scrollBy}, but scroll smoothly instead of immediately.
  
  @param x        the number of pixels to scroll by on the X axis
  @param y        the number of pixels to scroll by on the Y axis
  @param velocity the velocity associated with a fling, if applicable. (0 otherwise)