TextView跑马灯的实现

在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,大家想看的就下载看看吧。点击打开链接

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值