在Android中,TextView本身有一个属性:
android:ellipsize="marquee"
当ellipsize属性为mqrquee时,当文字长度大于textview的长度时,TextView中的文字将会以跑马灯的方式显示(和银行门前LED灯的标志一样)。
一般情况下,直接设置上面的属性就可以了,但是,在一个界面中与多个TextView需要跑马灯效果时,只有一个会有效果。
针对这个问题,网络上有很多种解释,但是其中很多的解释让我云里雾是,昨天在随便翻翻我不知道从哪里下载的代码时,发现了一个做跑马灯的demo,其中解决了这个问题,解决方式如下:
1. 自定义view继承textview
public class MarqueTextView extends TextView {
public MarqueTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MarqueTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueTextView(Context context) {
super(context);
}
@Override
public boolean isFocused() {
return true;
}
}
在这个自定义的view中重写isFocused方法并返回true。
2. 在布局文件中使用并指定ellipsize属性为marquee即可。
<com.example.marquetextview.MarqueTextView
android:id="@+id/tv_marque"
android:singleLine="true"
android:ellipsize="marquee"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:text="@string/hello_world" />
到这里问题就解决了,但是!why?
这里我做了一件让我豁然开朗的事情,command+单击,点进TextView的源码,搜索marquee,我看到了这样一段:
//TextView.Marquee.tick()
void tick() {
......
if (textView != null && (textView.isFocused() || textView.isSelected())) {
......
textView.invalidate();
}
}
OK,验证上面这一段代码是不是解决问题的方式很简单,将上面都的自定义TextView不重写isFocued方法,改而重写isSelected方法并返回false,看效果是不是多个TextView在滚动即可。
改完结果为:That is god damn OK。
继续查看源码,还可以查看到其他的一些源码,比如startMarquee方法等,但是我酝酿了好久,发现基于个人水平,不知道从何写起实在尴尬,就写这么多吧……