26
2017
09

关于Android实现TextView跑马灯效果

在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:marqueeRepeatMode="marquee_forever"
    //maxEms表示的是单行显示的最大长度,要实现跑马灯效果必须让文本内容大于最大长度
    //这里设置成6则代表最多显示5个中文字符
    android:maxEms="5"

关于跑马灯的实现基本介绍到这里,总结下,xml中设置为单行显示,省略模式设置为跑马灯,让内容大于最大长度,在代码中调用setSelected(true)设置为选中状态,则可实现跑马灯效果,而滚动次数可以在xml中通过marqueeRepeatMode属性来设置

谢谢大家阅读,本文到这结束,如有地方需要加以改进,还请指出,万分感谢~

上一篇:Java内存模式简介 下一篇:GSON解析泛型错误