在xml属性中设置
<TextView
android:width="wrap_content"
android:height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatMode="marquee_forever"
android:textSize="16sp"
android:maxEms="5"
android:text="内容长度一定要超过控件的长度"/>
解释下上面的几个属性,实现跑马灯效果的重要属性有两条
要实现跑马灯效果必须将当前TextView设置成单行显示
android:singleLine="true"
/*值得一提的是,现在的singleLine已经被官方废弃,
改用maxLines来代替,
但经过测试,要实现跑马灯效果,仍然需要使用singleLine
*/
然后将TextView的省略模式设置为marquee(滚动显示),这里说明下ellipsize属性的几种模式,start(省略前面的部分)、middle(省略中间的部分)、end(省略后面的部分)、marquee(滚动显示)
android:ellipsize="marquee"
实际上,上面两条设置已经实现了跑马灯效果,但实际测试却会发现并没有滚动显示,这是因为要让TextView“跑”起来必须要先满足它的“虚荣心”。
什么叫“虚荣心”呢?简单来说,就是让它知道,我们现在在看它,这里有两种方法,一种方法是给它焦点,一种方法是告诉它我们选中它了。
在这里我们先分析下focusable和selected两种状态了。不要混淆它们,如果你经常使用selector的话,你应该知道,它们代表两种不同的状态。
从字面上看,focusable代表的属性指是否获取到焦点,而selected代表的属性指是否选中,但这里要注意的有两个方面:
第一:focusable设置为true时,并不代表控件获取到了焦点,而是代表控件可以获取到焦点,
真正要获取到焦点要通过点击或者代码调用requestFocus()方法来获取
第二:selected状态只能由代码中调用setSelected(boolean)来设置,不会收到点击或者触摸控制,
即使你自定义触摸事件也依然是要调用setSelected(boolean)。
经过测试,我发现第一种获取焦点的方法并不好用,很多情况下都无法满足TextView的“虚荣心”,而第二种设置选中的方法却是没出现过任何问题,所以在这里我推荐大家使用第二种方法。当然,第一种方法的实现我也在这里贴出来:
第一种方法(在xml中设置如下属性):
android:focusable="true"//可以获取到焦点
android:focusableInTouchMode="true"//可以通过触摸获取到焦点
第二种方法(在代码里调用)(推荐):
textView.setSelected(true);
另外说下上面的xml中最后几个属性=
//marqueeRepeatMode指的是TextView滚动显示的次数
//默认是滚动3次,marquee_forever表示滚动无限次
android:marqueeRepeatLimit="marquee_forever"
//maxEms表示的是单行显示的最大长度,要实现跑马灯效果必须让文本内容大于最大长度
//这里设置成6则代表最多显示5个中文字符
android:maxEms="5"
关于跑马灯的实现基本介绍到这里,总结下,xml中设置为单行显示,省略模式设置为跑马灯,让内容大于最大长度,在代码中调用setSelected(true)设置为选中状态,则可实现跑马灯效果,而滚动次数可以在xml中通过marqueeRepeatLimit属性来设置