快捷搜索:   nginx

ScrollTextView-scrolling TextV

找了很就终于在国外一网站上找到一个Scroller的例子,为了日后方便查阅,在博客上记录以下。 Here are the source codes.

The key points are: setHorizontallyScrolling() and use android.widget.Scroller to make the text scroll; Use the attached TextPaint of the TextView to measure the length of the text in pixel; setSingleLine() and setEllipsize(null) to make the text not wrapped and ellipsized; Override computeScroll() to restart the scrolling when finished Here are the source codes.  
  1. /*************************************************************************/ package com.dirtybear.android;  
  2.  import android.content.Context;  
  3. import android.graphics.Rect;  import android.text.TextPaint;  
  4. import android.util.AttributeSet;  import android.view.animation.LinearInterpolator;  
  5. import android.widget.Scroller;  import android.widget.TextView;  
  6.  public class ScrollTextView extends TextView {  
  7.  // scrolling feature  
  8. private Scroller mSlr;   
  9. // milliseconds for a round of scrolling  private int mRndDuration = 250;  
  10.  // the X offset when paused  
  11. private int mXPaused = 0;   
  12. // whether it's being paused  private boolean mPaused = true;  
  13.  /*  
  14. * constructor  */ 
  15. public ScrollTextView(Context context) {  this(context, null);  
  16. }   
  17. /*  * constructor  
  18. */ public ScrollTextView(Context context, AttributeSet attrs) {  
  19. this(context, attrs, android.R.attr.textViewStyle);  }  
  20.  /*  
  21. * constructor  */ 
  22. public ScrollTextView(Context context, AttributeSet attrs, int defStyle) {  super(context, attrs, defStyle);  
  23. // customize the TextView  setSingleLine();  
  24. setEllipsize(null);  setVisibility(INVISIBLE);  
  25. }   
  26. /**  * begin to scroll the text from the original position  
  27. */ public void startScroll() {  
  28. // begin from the very right side  mXPaused = -1 * getWidth();  
  29. // assume it's paused  mPaused = true;  
  30. resumeScroll();  }  
  31.  /**  
  32. * resume the scroll from the pausing point  */ 
  33. public void resumeScroll() {   
  34. if (!mPaused)  return;  
  35.  // Do not know why it would not scroll sometimes  
  36. // if setHorizontallyScrolling is called in constructor.  setHorizontallyScrolling(true);  
  37.  // use LinearInterpolator for steady scrolling  
  38. mSlr = new Scroller(this.getContext(), new LinearInterpolator());  setScroller(mSlr);  
  39.  int scrollingLen = calculateScrollingLen();  
  40. int distance = scrollingLen - (getWidth() + mXPaused);  int duration = (new Double(mRndDuration * distance * 1.00000 
  41. / scrollingLen)).intValue();   
  42. setVisibility(VISIBLE);  mSlr.startScroll(mXPaused, 0, distance, 0, duration);  
  43. mPaused = false;  }  
  44.  /**  
  45. * calculate the scrolling length of the text in pixel  *  
  46. * @return the scrolling length in pixels  */ 
  47. private int calculateScrollingLen() {  TextPaint tp = getPaint();  
  48. Rect rect = new Rect();  String strTxt = getText().toString();  
  49. tp.getTextBounds(strTxt, 0, strTxt.length(), rect);  int scrollingLen = rect.width() + getWidth();  
  50. rect = null;  return scrollingLen;  
  51. }   
  52. /** 
  53. * 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() && (!mPaused)) {
    this.startScroll();
    }
    }

    public int getRndDuration() {
    return mRndDuration;
    }

    public void setRndDuration(int duration) {
    this.mRndDuration = duration;
    }

    public boolean isPaused() {
    return mPaused;
    }
    }
    /*************************************************************************/
  Issues to be fixed:
    Do not know why it would not scroll sometimes if setHorizontallyScrolling is called in constructor; The scrolling is not smooth enough. Maybe it's because of the single thread model of Android UI;

  Tested on:
  Windows XP
  Android SDK 1.0 rc2
  Android Emulator 1.0
  Android Debug Bridge version 1.0.20
顶(1)
踩(0)

您可能还会对下面的文章感兴趣:

最新评论