code: public void fakeDragBy(float xOffset) {
          if (!mFakeDragging) {
              throw new IllegalStateException("No fake drag in progress. Call beginFakeDrag first.");
          }
  
          mLastMotionX += xOffset;
  
          float oldScrollX = getScrollX();
          float scrollX = oldScrollX - xOffset;
          final int width = getClientWidth();
  
          float leftBound = width * mFirstOffset;
          float rightBound = width * mLastOffset;
  
          final ItemInfo firstItem = mItems.get(0);
          final ItemInfo lastItem = mItems.get(mItems.size() - 1);
          if (firstItem.position != 0) {
              leftBound = firstItem.offset * width;
          }
          if (lastItem.position != mAdapter.getCount() - 1) {
              rightBound = lastItem.offset * width;
          }
  
          if (scrollX < leftBound) {
              scrollX = leftBound;
          } else if (scrollX > rightBound) {
              scrollX = rightBound;
          }
          // Don't lose the rounded component
          mLastMotionX += scrollX - (int) scrollX;
          scrollTo((int) scrollX, getScrollY());
          pageScrolled((int) scrollX);
  
          // Synthesize an event for the VelocityTracker.
          final long time = SystemClock.uptimeMillis();
          final MotionEvent ev = MotionEvent.obtain(mFakeDragBeginTime, time, MotionEvent.ACTION_MOVE,
                  mLastMotionX, 0, 0);
          mVelocityTracker.addMovement(ev);
          ev.recycle();
      }
docs: Fake drag by an offset in pixels. You must have called {@link #beginFakeDrag()} first.
  
  @param xOffset Offset in pixels to drag by.
  @see #beginFakeDrag()
  @see #endFakeDrag()