选框设定速度

我正在使用一个选框来显示我的一个活动中的文本。 我的问题是有可能加快选框的速度,使其更快地滚动屏幕。 下面是我的XML和Java。

TextView et2 = (TextView) findViewById(R.id.noneednum); et2.setEllipsize(TruncateAt.MARQUEE); et2.setText(""); if (num.size() > 0) { for (String str : num) { et2.append(str + " "); } } et2.setSelected(true); } 

和XML:

  

Related of "选框设定速度"

您必须创建一个用于滚动文本的自定义类:

ScrollTextView.java

 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 distance = scrollingLen - (getWidth() + mXPaused); int duration = (new Double(mRndDuration * distance * 1.00000 / scrollingLen)).intValue(); setVisibility(VISIBLE); mSlr.startScroll(mXPaused, 0, distance, 0, duration); invalidate(); 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(); 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() && (!mPaused)) { this.startScroll(); } } public int getRndDuration() { return mRndDuration; } public void setRndDuration(int duration) { this.mRndDuration = duration; } public boolean isPaused() { return mPaused; } } 

在您的布局中写如下:

  

在你的活动中写这样的:

 ScrollTextView scrolltext=(ScrollTextView) findViewById(R.id.scrolltext); scrolltext.setText(yourscrollingtext); scrolltext.setTextColor(Color.BLACK); scrolltext.startScroll(); 

如果要增加滚动速度,请减小以下值:

 private int mRndDuration = 10000;//reduce the value of mRndDuration to increase scrolling speed 

这对我有用。 如果f.get(tv)返回null,请在调用setMarqueeSpeed()之前尝试调用mTextView.setSelected(true)。 原始答案: Android和TextView的水平选框滚动率

 private void setMarqueeSpeed(TextView tv, float speed, boolean speedIsMultiplier) { try { Field f = tv.getClass().getDeclaredField("mMarquee"); f.setAccessible(true); Object marquee = f.get(tv); if (marquee != null) { String scrollSpeedFieldName = "mScrollUnit"; if(Build.VERSION.SDK_INT >= Build.VERSION_CODES.L) scrollSpeedFieldName = "mPixelsPerSecond"; Field mf = marquee.getClass().getDeclaredField(scrollSpeedFieldName); mf.setAccessible(true); float newSpeed = speed; if (speedIsMultiplier) newSpeed = mf.getFloat(marquee) * speed; mf.setFloat(marquee, newSpeed); } } catch (Exception e) { e.printStackTrace(); } } 

如果TextView是AppCompatTextView的实例,则上面的代码会失败。 下面的代码作品是AppCompatTextView。 在棉花糖中测试过。

 public static void setMarqueeSpeed(TextView tv, float speed) { if (tv != null) { try { Field f = null; if (tv instanceof AppCompatTextView) { f = tv.getClass().getSuperclass().getDeclaredField("mMarquee"); } else { f = tv.getClass().getDeclaredField("mMarquee"); } if (f != null) { f.setAccessible(true); Object marquee = f.get(tv); if (marquee != null) { String scrollSpeedFieldName = "mScrollUnit"; if (Build.VERSION.SDK_INT >= Build.VERSION_CODES.LOLLIPOP) { scrollSpeedFieldName = "mPixelsPerSecond"; } Field mf = marquee.getClass().getDeclaredField(scrollSpeedFieldName); mf.setAccessible(true); mf.setFloat(marquee, speed); } } else { Logger.e("Marquee", "mMarquee object is null."); } } catch (Exception e) { e.printStackTrace(); } } }