我正在尝试实现一个自动滚动的单行文本视图。但我不幸的是无法让它发挥作用。 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);
}
};
}
答案 0 :(得分:180)
如果您不需要对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);
[根据评论编辑的答案]
答案 1 :(得分:18)
在@rajat
回答这些xml代码之后<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);
最终使我的工作
答案 2 :(得分:16)
我的解决方案有效:
<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
,例如。{/ p>
答案 3 :(得分:1)
// 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" />
答案 4 :(得分:0)
有些无效,直到你在主线程中调用invalidate,如下所示:
handler.post(new Runnable() {
@Override
public void run() {
yourView.invalidate();
}
});
答案 5 :(得分:0)
提示:您的文本长度应大,否则,如果文本长度不超过您的屏幕尺寸,则不能用于小长度的文本。
< TextView
android:id="@+id/support"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:text=" enter the large text that wont fit on screen "
android:singleLine="true"
android:scrollHorizontally="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
/>
以及您的活动
TextView textView=findViewById(R.id.support);
textView.setSelected(true);