Android自动水平滚动TextView

我正在尝试实现将自动滚动的单行文本视图。 但是我不幸得不到它的工作。 AutoScrollTextView是在LinearLayout(width和height = fill_parent)中声明的。 这个类基本上使用一个Handler来调用自己滚动给定的数量。 我简化了代码,只显示一个文本视图,应该每秒滚动5个像素。

日志输出是正确的,getScrollX()方法返回适当的scrollX位置。

如果我不调用requestLayout() ,没有任何东西被绘制。 invalidate()不起作用。

有人会有线索吗?

 public class AutoScrollTextView extends TextView { public AutoScrollTextView(Context context, AttributeSet attrs, int defStyle) { super(context, attrs, defStyle); setSingleLine(); setEllipsize(null); setText("Single-line text view that scrolls automatically if the text is too long to fit in the widget"); } // begin to scroll the text from the original position public void startScrolling() { scrollHandler.sendEmptyMessage(0); } private Handler scrollHandler = new Handler() { private static final int REFRESH_INTERVAL = 1000; public void handleMessage(Message msg) { scrollBy(5, 0); requestLayout(); Log.debug("Scrolled to " + getScrollX() + " px"); sendEmptyMessageDelayed(0, REFRESH_INTERVAL); } }; } 

如果你不需要对TextView进行子类化,你可以在布局文件中试试这个:

  <TextView android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit ="marquee_forever" android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

另外,在你的代码中使用下面的代码:

 findViewById(R.id.serviceColorCode).setSelected(true); 

[根据意见编辑回答]

我的解决scheme工作

 <TextView android:id="@+id/titolotxt" android:layout_width="..." android:layout_height="..." android:ellipsize="marquee" android:gravity="left" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="@string/titolo"/> 

TextView必须被设置为: textView.setSelected(true); 例如通过onCreate的代码。

在这些XML代码被@rajat回答后

 <TextView android:text="Single-line text view that scrolls automatically if the text is too long to fit in the widget" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit ="marquee_forever" android:focusable="true" android:focusableInTouchMode="true" android:scrollHorizontally="true" android:layout_width="wrap_content" android:layout_height="wrap_content"/> 

我们需要设置

 TextView tv=(TextView)findViewById(R.id.textview1); tv.setSelected(true); 

最终使我的工作

有时无效将无法正常工作,直到你在主线程中调用无效,如下所示:

 handler.post(new Runnable() { @Override public void run() { yourView.invalidate(); } }); 
 // this TextView will marquee because it is selected TextView marqueeText1 = (TextView) findViewById(R.id.marquee_text_1); marqueeText1.setSelected(true); <TextView android:id="@+id/marquee_text_1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:text="Lorem ipsum dolor sit amet, consectetur adipiscing elit." android:textSize="24sp" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" android:scrollHorizontally="true" />