为TextView设置这些属性:

ellipsize = TextUtils.TruncateAt.MARQUEE
transformationMethod = SingleLineTransformationMethod.getInstance()
setHorizontallyScrolling(true)

只有在TextView得到了焦点或处于selected状态时,才会开始滚动。
为方便使用,可以继承TextView并重写isFocused()方法,让TextView认为焦点一直有获取到:

override fun isFocused() = true

默认情况下,TextView只滚动3次 。
可以修改marqueeRepeatLimit为-1,以实现无限滚动。当然,也可以指定滚动次数。

marqueeRepeatLimit = -1

TextView需要在绘制完成后,设置的文本才能滚动。
如果设置文本的操作是异步的,存在绘制完成前就设置了文本的可能,那就会出现一开始不滚动,关屏重开、弹出输入法等操作之后才开始滚动的情况。
这种情况则需要使用post来设置文本:

tv.post { tv.text = content }