今天练习的时候想实现一个文字的跑马灯效果,原本想本身手动实现的,不过忽然想起来android里的TextView属性彷佛自带了这个效果,叫: android:ellipsize ,平时都是把它的属性值设置成 end ,表示文字超出了必定的范围就显示省略号,若是要实现跑马灯的效果,就须要将它的属性值设置成 marquee ,就是: android:ellipsize="marquee" 。我只记得它有这么个属性值,可是历来没用过,今天真正用了一次才发现这个属性值并无那么简单:html
按照惯例,通常用到这个属性值,就说明文字的长度超过了TextView的长度,并且通常都是在单行文本中进行滚动显示的。因此我先将TextView的属性设置以下:android
<TextView android:layout_width="100dip" android:layout_height="wrap_content" android:text="请使用手机扫描二维码,而后链接设备请使用二维码扫描手机,而后链接设备请使用二维码扫描手机,而后链接设备请使用二维码扫描手机,而后链接设备" android:ellipsize="marquee" android:singleLine="true" />
按照个人理解,文本长度是确定会超过TextView的显示长度的,而我也确实将TextView设置成单行, android:ellipsize 的属性值指定为 marquee 了,但遗憾的是在手机上跑起来并无任何的效果。没办法,只能求教于百度,网上的说法有不少,大概有如下几种:dom
第一种作法:新建一个继承于TextView的自定义View,重写其方法spa
参考连接:https://blog.csdn.net/shanshan_1117/article/details/78616901.net
这种方法我没有试,或许可行,但我很不喜欢,既然android自带了这个属性,直接用这个属性就行了,为了实现一个效果(这个效果仍是系统自带的)还要去新建一个View,得不偿失。code
第二种作法:在xml文件中指定 android:textIsSelectable="true" 或是在代码中设置 setSelected(true)xml
参考连接:https://www.cnblogs.com/ufreedom/p/4248142.htmlhtm
这位博主写了不少,也分析了不少,最终结论就是上面的两种办法,说实话我挺佩服他的,能钻研的这么细(换作是我可能就自定义一个View了。。。我也只是在实在没办法的时候才去看源码),因而照着他的办法试了下,给TextView添加了 android:textIsSelectable="true" 属性,满心欢喜的跑了一下看了下效果,结果仍是没有用。。。也许这位博主的办法确实有用,只是个人手机太特殊了(华为P10)。blog
第三种作法:在xml文件中同时指定 android:focusable="true" 和 android:focusableInTouchMode="true" 继承
参考连接:http://www.javashuo.com/article/p-xoojbbay-ge.html
这位博主一样也写了不少,也列举了好几种状况,有些办法甚至于还要在TextView上加 android:clickable="true" ,感受怪怪的,我在手机上跑了下,一样也不行,没法实现跑马灯的效果。可是,须要特别说明的是,这种办法实际上是有效的,若是直接在手机上跑,跑马灯效果确实是没有,但我手头恰好有一个USB口的遥控器,能够经过上下导航键选中到TextView,若是是经过遥控器上的上下导航键选中这个TextView,那么这个TextView的跑马灯效果就显示出来了,可是咱们用的是手机,进来的时候就要显示。
其它作法:在代码中对TextView进行修改
这种作法的连接就不贴了,网上有不少,但仍是那个问题,设置一个TextView的效果,还要分别在XML和代码中分别定义,我的实在是不喜欢。
个人作法:
仔细看了下第三种作法中博主的描述,大概以为,要想使TextView拥有跑马灯的效果,那么这个TextView就必定要可以获取到焦点,因而我在它的作法上进行了修改:
<TextView android:layout_width="200dip" android:layout_height="wrap_content" android:text="请使用二维码扫描手机,而后链接设备请使用二维码扫描手机,而后链接设备请使用二维码扫描手机,而后链接设备请使用二维码扫描手机,而后链接设备" android:ellipsize="marquee" android:singleLine="true" android:focusableInTouchMode="true" > <requestFocus/> </TextView>
再次运行试了下,跑马灯效果有了:
我反复试了下,这个 android:focusableInTouchMode="true" 属性是必须的, android:focusable="true" 属性却不是必须的。
最后,须要声明下,我也只是在个人手机下(华为P10)运行经过,别的手机我没有试过,我相信上面的几位博主确定也是在各自的手机上试过了才会发表博文的,android手机众多,我也不敢保证本身的作法必定在全部的手机上都有效。