7——使用TextView实现跑马灯

首先给TextView添加一个单行限制:
android:singleLine="true"

- 解决方案一
更改TextView的一个属性:
android:ellipsize="marquee"
即省略多余部分的意思,包括去掉省略号(然而我在Android 6上面并没有省略省略号)。

然而,该有的东西都被省略了。不满意。

- 解决方案二
在方案一的基础上。添加如下两个属性:
android:focusable="true" android:focusableInTouchMode="true"
这样可以实现当行的循环跑马灯。

然而,如果同时有两个类似的TextView出现时,会发现只有一个有跑马灯的效果,另一个则失效,因此该功能也是不够的。

- 解决方案三
在之前两个方案的基础上,自己对TextView进行改写。
1.先新建一个类,比如MarqueeText.java ,且这个类继承了TextView。
只会我们对这个类进行如下的改写,添加所需的几个构造函数。
2.要对isFocused()进行重写,使返回值都为true。
这是因为,之前的TextView控件在使用时,第一个标签默认获取的了焦点,而之后的TextView则失去了焦点,因而不能实现跑马灯效果。
3.如果想要一直循环的话,应该加上android:marqueeRepeatLimit="marquee_forever"。否则循环两次。
之后layout中,可以直接使用包名作为新的标签,如 <com.example.Marquee>,直接可实现跑马灯效果。

public class MarqueeText extends TextView { public MarqueeText(Context context) { super(context); } public MarqueeText(Context context, AttributeSet attrs) { super(context, attrs); } public MarqueeText(Context context, AttributeSet attrs, int defStyleAttr) { super(context, attrs, defStyleAttr); } @Override public boolean isFocused() { return true; } }

- 总结

  1. 更改TextView的一个属性:
    android:ellipsize="marquee"
  2. 添加如下两个属性:
    android:focusable="true"
    android:focusableInTouchMode="true"
    3.新建一个类继承了TextView的类,并重写isFocused()使默认返回true。
    4.加上android:marqueeRepeatLimit="marquee_forever"可以一直循环,否则默认循环两次。
posted @ 2016-07-23 23:36  Ben-X  阅读(123)  评论(0编辑  收藏  举报