在TextView属性中有这样的一个属性:
android:ellipsize 设置当文字过长时,该控件该如何显示。有如下值设置:”start”省略号显示在开头;”end”省略号显示在结尾;”middle”省略号显示在中间;;”marquee” 以跑马灯的方式显示(动画横向移动) 。
好像跑马灯这种效果已经不用咱们来实现了,呵呵,不过有一点,如果文字不过长,在组件的范围内,还想要跑马灯的效果怎么办呢?当然的自己自定义啦,那还能怎么做,哈哈。。。
上代码,大家看看哈,注释写的很清楚啦,我也不再多说了,copy走就能用啊。。
/**
* 跑马灯效果的TextView。
*
* @author luckchoudog
*/
public class MarqueeTextView extends TextView implements Runnable {
/**
* 自定义的变量,记录当前滚动的位置。
*/
private int currentScrollX;
/**
* 自定义的变量,是否停止跑动。
*/
private boolean isStop = false;
/**
* 自定义的变量,初始化的时候测量的字体的宽度值。
*/
private int textWidth;
/**
* 自定义的变量,初始化的时候是否测量字体的宽度。
*/
private boolean isMeasure = false;
public MarqueeTextView(Context context) {
super(context);
}
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
// 文字宽度只需获取一次就可以了
if (!isMeasure) {
getTextWidth();
isMeasure = true;
}
}
/**
* 获取文字宽度
*/
private void getTextWidth() {
Paint paint = this.getPaint();
String str = this.getText().toString();
textWidth = (int) paint.measureText(str);
}
/**
* 重写setText方法
*/
@Override
public void setText(CharSequence text, BufferType type) {
// 重写setText 在setText的时候重新计算text的宽度
super.setText(text, type);
this.isMeasure = false;
}
@Override
public void run() {
// 滚动跨度,没执行一次这个文字平移的跨度。
currentScrollX -= 2;
scrollTo(currentScrollX, 0);
if (isStop) {
return;
}
if (getScrollX() <= -(this.getWidth())) {
scrollTo(textWidth, 0);
currentScrollX = textWidth;
}
// 第二个参数可以控制平移的速度,数值越小表示越快,可以结合滚动跨度来设置平移速度。
postDelayed(this, 5);
}
/**
* 开始滚动
*/
public void startScroll() {
isStop = false;
this.removeCallbacks(this);
post(this);
}
/**
* 停止滚动
*/
public void stopScroll() {
isStop = true;
}
/**
* 从头开始滚动
*/
public void startFor0() {
currentScrollX = 0;
startScroll();
}
}
自己写的一个小demo,大家想看的就下载看看吧。点击打开链接