
前言
之前有写一篇TextVIEw跑马灯的效果,后来实际项目中有发现新的问题,比如还是无法自动跑,文本超过了显示区域就截取的问题,今天换了一种思路来实现,更简单更好用。
正文
代码实现:
public class MarqueeTextVIEw extends TextVIEw { /** 是否停止滚动 */ private boolean mStopMarquee; private String mText; private float mCoordinateX; private float mTextWIDth; public MarqueeTextVIEw(Context context,AttributeSet attrs) { super(context,attrs); } public voID setText(String text) { this.mText = text; mTextWIDth = getPaint().measureText(mText); if (mHandler.hasMessages(0)) mHandler.removeMessages(0); mHandler.sendEmptyMessageDelayed(0,2000); } @OverrIDe protected voID onAttachedToWindow() { mStopMarquee = false; if (!StringUtils.isEmpty(mText)) mHandler.sendEmptyMessageDelayed(0,2000); super.onAttachedToWindow(); } @OverrIDe protected voID onDetachedFromWindow() { mStopMarquee = true; if (mHandler.hasMessages(0)) mHandler.removeMessages(0); super.onDetachedFromWindow(); } @OverrIDe protected voID onDraw(Canvas canvas) { super.onDraw(canvas); if (!StringUtils.isEmpty(mText)) canvas.drawText(mText,mCoordinateX,15,getPaint()); } private Handler mHandler = new Handler() { @OverrIDe public voID handleMessage(Message msg) { switch (msg.what) { case 0: if (Math.abs(mCoordinateX) > (mTextWIDth + 100)) { mCoordinateX = 0; invalIDate(); if (!mStopMarquee) { sendEmptyMessageDelayed(0,2000); } } else { mCoordinateX -= 1; invalIDate(); if (!mStopMarquee) { sendEmptyMessageDelayed(0,30); } } break; } super.handleMessage(msg); } };}代码说明:
1、2000表示延迟2秒开始跑马灯效果
2、mTextWIDth + 100 表示跑出屏幕100像素再重新开始跑
3、每30毫秒移动1像素
4、原理很简单,就是定时刷,用法很简单,直接setText就行,和用系统的一样,但是不能通过设置xml的值来直接跑,这个可以自己修改。
5、注意onDraw时判定一下text是否为空,这里StringUtils.isEmpty替换成自己的判定方法即可。
以上就是AndroID 实现跑马灯的实例代码,有需要的朋友可以参考下。
总结以上是内存溢出为你收集整理的Android 实现不依赖焦点和选中的TextView跑马灯全部内容,希望文章能够帮你解决Android 实现不依赖焦点和选中的TextView跑马灯所遇到的程序开发问题。
如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)