android 如何监听跑马灯效果

本文介绍了在Android中监听跑马灯效果的方法,特别是如何判断跑马灯完成一圈后停止的技巧。通过监听draw间隔,实现精确控制跑马灯的循环行为。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

如何监听跑马灯,跑完一圈?

思路很清楚,跑马灯会一直draw,但会发现文本跑完一圈后没停一下子,那监听draw的间隔不就行了?代码贴上:

使用:

tv.setOnMarqueeCompleteListener(new AutoText.OnMarqueeCompleteListener() {
		@Override
		public void onMarqueeComplete() {
		}
	});
自定义TextView:
import android.content.Context;
import android.graphics.Canvas;
import android.util.AttributeSet;
import android.widget.TextView;

public class AutoText extends TextView {

	private OnMarqueeCompleteListener marqueeCompleteListener;

	private long mTime = 0;
	private long longs = 0;

	public AutoText(Context context) {
		this(context, null);
	}

	public AutoText(Context context, AttributeSet attrs) {
		this(context, attrs, 0);
	}

	public AutoText(Context context, AttributeSet attrs, int defStyle) {
		super(context, attrs, defStyle);
	}

	// 开始监听
	public void setOnMarqueeCompleteListener(OnMarqueeCompleteListener marqueeCompleteListener) {
		this.marqueeCompleteListener = marqueeCompleteListener;
		// 避免一些机子反应慢,postDelayed一下
		postDelayed(new Runnable() {
			@Override
			public void run() {
				mTime = -1;
				longs = -1;
			}
		}, 3000);
	}

	@Override
	protected void onDraw(Canvas canvas) {
		super.onDraw(canvas);
		if (mTime == -1) {
			mTime = System.currentTimeMillis();
		} else if (longs == -1) {
			long time = System.currentTimeMillis();
			longs = time - mTime;
			mTime = time;
		} else if (longs != 0) {
			long time = System.currentTimeMillis();
			long thisLong = time - mTime;
			mTime = time;
			if (thisLong > 10 * longs) {
				if (null != marqueeCompleteListener) {
					LogUtil.i("AutoText", "MarqueeCompleteListener onMarqueeComplete");
					marqueeCompleteListener.onMarqueeComplete();
				}
			}
		}
	}

	public interface OnMarqueeCompleteListener {
		void onMarqueeComplete();
	}

}

实现跑马灯

xml里实现:

	android:ellipsize="marquee"
	android:focusable="true"
	android:focusableInTouchMode="true"
	android:gravity="center"
	android:lines="1"
	android:marqueeRepeatLimit="marquee_forever"

代码实现:

tvMarquee.setEllipsize(TextUtils.TruncateAt.MARQUEE);
tvMarquee.setSingleLine(true);
tvMarquee.setSelected(true);
tvMarquee.setFocusable(true);
tvMarquee.setFocusableInTouchMode(true);



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值