Android TextView设置跑马灯失效
1.关于问题
TextView失效在网上有详细的解决方案,大部分时候都能够很好的解决问题
下面给出网上的解决方案:
<TextView
android:layout_width="100dp"
android:layout_height="22dp"
tools:text="水浇地放松放松开发的开始放假考试的飞机开了撒酒疯恐龙时代解封了开始的"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:textSize="13sp"
android:textColor="@color/black"/>
以上就是一个简单的固定宽高的TextView,显然文字的长度超过了控件的宽度
ellipsize属性官方给出的解释如下:
意思就是使文本中比视图宽度长的单词省略号,而不是在在中间断开。
该属性的枚举值为
public enum TruncateAt {
START,
MIDDLE,
END,
MARQUEE,
/**
* @hide
*/
@UnsupportedAppUsage
END_SMALL
}
主要是设置省略号的位置,而其中MARQUEE就是本文要学习的跑马灯效果
2.跑马灯效果
除了在XML布局文件中设置如下属性
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
还需要在代码中设置属性,动态设置的目的是为了请求焦点,在界面刷新的时候也能正常展示跑马灯效果
val textView= findViewById<TextView>(R.id.textView)
textView.text = "放假恐龙时代减肥路上看见发了康师傅就开始两地分居老师到家了客服就是"
textView.ellipsize = TextUtils.TruncateAt.MARQUEE
textView.isSingleLine = true
textView.isSelected = true
textView.isFocusable = true
textView.isFocusableInTouchMode = true
3.特殊情况下的处理
以上是结合官方文档说明和网上大多数解决问题的方案得来的,正常情况下可以完美运行
问题1
当前页面存在多个TextView的情况失效:
相信很多同学在开发过程中都遇到过该问题,尤其是RecyclerView和Adapter结合展示列表,
字符串过长要完整展示的情况很多
如果此时出现了刷新才能展示跑马灯或者部分Item跑马灯效果失效,只显示省略号,
这种情况基本都是控件绘制或者刷新未完成的情况下,设置的跑马灯属性失效,解决方案如下
val textView= findViewById<TextView>(R.id.textVuew)
textView.post {
textView.text = "放假克里斯多夫就流口水地方康师傅就是了对方开始减肥就是放假克里斯多夫就凉快"
textView.ellipsize = TextUtils.TruncateAt.MARQUEE
textView.isSingleLine = true
textView.isSelected = true
textView.isFocusable = true
textView.isFocusableInTouchMode = true
}
控件增加post方法的回调,类似于一个Handler,把控件的刷新和绘制结果通过post方式发送到主线成。
问题2
给TextView设置动态文本,文本内容变化的时间未知,设置定时器给TextView设置文本,导致文本跑马灯在未完成的情况不断重置
这种情况,需要缓存当前文本内容,只有在文本内容发生改变是才设置,否则相同的文本,用定时器设置时会不停重置跑马灯动画。