title: Build a Continous side scrolling TextView in Android
body: <p>I am trying to build a <code>TextView</code> that scrolls continuously sideways. I found some code on <code>stackoverflow</code> and used it as is. I want it such that beginning and end are wrapped together and not having a gap as it is now.</p>
  
  <p><strong>Here is the code I used:</strong></p>
  
  <pre><code>public class ScrollTextView extends TextView {
  
      // scrolling feature
      private Scroller mSlr;
  
      // milliseconds for a round of scrolling
      private int mRndDuration = 10000;
  
      // the X offset when paused
      private int mXPaused = 0;
  
      // whether it's being paused
      private boolean mPaused = true;
  
      /*
       * constructor
       */
      public ScrollTextView(Context context) {
          this(context, null);
          // customize the TextView
          setSingleLine();
          setEllipsize(null);
          setVisibility(INVISIBLE);
      }
  
      /*
       * constructor
       */
      public ScrollTextView(Context context, AttributeSet attrs) {
          this(context, attrs, android.R.attr.textViewStyle);
          // customize the TextView
          setSingleLine();
          setEllipsize(null);
          setVisibility(INVISIBLE);
      }
  
      /*
       * constructor
       */
      public ScrollTextView(Context context, AttributeSet attrs, int defStyle) {
          super(context, attrs, defStyle);
          // customize the TextView
          setSingleLine();
          setEllipsize(null);
          setVisibility(INVISIBLE);
      }
  
      /**
       * begin to scroll the text from the original position
       */
      public void startScroll() {
          // begin from the very right side
          mXPaused = -1 * getWidth();
          // assume it's paused
          mPaused = true;
          resumeScroll();
      }
  
      /**
       * resume the scroll from the pausing point
       */
      public void resumeScroll() {
  
          if (!mPaused)
              return;
  
          // Do not know why it would not scroll sometimes
          // if setHorizontallyScrolling is called in constructor.
          setHorizontallyScrolling(true);
  
          // use LinearInterpolator for steady scrolling
          mSlr = new Scroller(this.getContext(), new LinearInterpolator());
          setScroller(mSlr);
  
          int scrollingLen = calculateScrollingLen();
          // int scrollingLen = 1;
          int distance = scrollingLen - (getWidth() + mXPaused);
          int duration = (new Double(mRndDuration * distance * 1.00000
                  / scrollingLen)).intValue();
  
          setVisibility(VISIBLE);
          mSlr.startScroll(mXPaused, 0, distance, 0, duration);
          mPaused = false;
      }
  
      /**
       * calculate the scrolling length of the text in pixel
       * 
       * @return the scrolling length in pixels
       */
      private int calculateScrollingLen() {
          TextPaint tp = getPaint();
          Rect rect = new Rect();
          String strTxt = getText().toString();
          tp.getTextBounds(strTxt, 0, strTxt.length(), rect);
  //      int scrollingLen = rect.width() + getWidth();
          int scrollingLen = rect.width();
          rect = null;
          return scrollingLen;
      }
  
      /**
       * pause scrolling the text
       */
      public void pauseScroll() {
          if (null == mSlr)
              return;
  
          if (mPaused)
              return;
  
          mPaused = true;
  
          // abortAnimation sets the current X to be the final X,
          // and sets isFinished to be true
          // so current position shall be saved
          mXPaused = mSlr.getCurrX();
  
          mSlr.abortAnimation();
      }
  
      @Override
      /*
       * override the computeScroll to restart scrolling when finished so as that
       * the text is scrolled forever
       */
      public void computeScroll() {
          super.computeScroll();
  
          if (null == mSlr)
              return;
  
          if (mSlr.isFinished() &amp;&amp; (!mPaused)) {
              this.startScroll();
          }
      }
  
      public int getRndDuration() {
          return mRndDuration;
      }
  
      public void setRndDuration(int duration) {
          this.mRndDuration = duration;
      }
  
      public boolean isPaused() {
          return mPaused;
      }
  
  }
  </code></pre>
  
  <p>Thanks in Advance...</p>