TextView: android:ellipsize="marquee" 跑马灯效果无效的问题
今天练习的时候想实现一个文字的跑马灯效果,本来想自己手动实现的,不过突然想起来android里的TextView属性似乎自带了这个效果,叫: android:ellipsize ,平时都是把它的属性值设置成 end ,表示文字超出了一定的范围就显示省略号,如果要实现跑马灯的效果,就需要将它的属性值设置成 marquee ,就是: android:ellipsize="marquee" 。我只记得它有这么个属性值,但是从来没用过,今天真正用了一次才发现这个属性值并没有那么简单:
按照惯例,一般用到这个属性值,就说明文字的长度超过了TextView的长度,而且一般都是在单行文本中进行滚动显示的。所以我先将TextView的属性设置如下:
<TextView android:layout_width="100dip" android:layout_height="wrap_content" android:text="请使用手机扫描二维码,然后连接设备请使用二维码扫描手机,然后连接设备请使用二维码扫描手机,然后连接设备请使用二维码扫描手机,然后连接设备" android:ellipsize="marquee" android:singleLine="true" />
按照我的理解,文本长度是肯定会超过TextView的显示长度的,而我也确实将TextView设置成单行, android:ellipsize 的属性值指定为 marquee 了,但遗憾的是在手机上跑起来并没有任何的效果。没办法,只能求教于百度,网上的说法有很多,大概有以下几种:
第一种做法:新建一个继承于TextView的自定义View,重写其方法
参考链接:https://blog.csdn.net/shanshan_1117/article/details/78616901
这种方法我没有试,或许可行,但我很不喜欢,既然android自带了这个属性,直接用这个属性就好了,为了实现一个效果(这个效果还是系统自带的)还要去新建一个View,得不偿失。
第二种做法:在xml文件中指定 android:textIsSelectable="true" 或是在代码中设置 setSelected(true)
参考链接:https://www.cnblogs.com/ufreedom/p/4248142.html
这位博主写了很多,也分析了很多,最终结论就是上面的两种办法,说实话我挺佩服他的,能钻研的这么细(换做是我可能就自定义一个View了。。。我也只是在实在没办法的时候才去看源码),于是照着他的办法试了下,给TextView添加了 android:textIsSelectable="true" 属性,满心欢喜的跑了一下看了下效果,结果还是没有用。。。也许这位博主的办法确实有用,只是我的手机太特殊了(华为P10)。
第三种做法:在xml文件中同时指定 android:focusable="true" 和 android:focusableInTouchMode="true"
参考链接:https://www.cnblogs.com/Gaojiecai/p/3142783.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手机众多,我也不敢保证自己的做法一定在所有的手机上都有效。
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· Linux系列:如何用 C#调用 C方法造成内存泄露
· AI与.NET技术实操系列(二):开始使用ML.NET
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 物流快递公司核心技术能力-地址解析分单基础技术分享
· .NET 10首个预览版发布:重大改进与新特性概览!
· 单线程的Redis速度为什么快?
· 展开说说关于C#中ORM框架的用法!
· Pantheons:用 TypeScript 打造主流大模型对话的一站式集成库
2018-09-18 Nexus6p:正在下载系统更新,没有进度
2017-09-18 android studio - 使android studio 在提示时不区分大小写