Android 实现不依赖焦点和选中的TextView跑马灯
前言
之前有写一篇TextView跑马灯的效果,后来实际项目中有发现新的问题,比如还是无法自动跑,文本超过了显示区域就截取的问题,今天换了一种思路来实现,更简单更好用。
正文
代码实现:
publicclassMarqueeTextViewextendsTextView{
/**是否停止滚动*/
privatebooleanmStopMarquee;
privateStringmText;
privatefloatmCoordinateX;
privatefloatmTextWidth;
publicMarqueeTextView(Contextcontext,AttributeSetattrs){
super(context,attrs);
}
publicvoidsetText(Stringtext){
this.mText=text;
mTextWidth=getPaint().measureText(mText);
if(mHandler.hasMessages(0))
mHandler.removeMessages(0);
mHandler.sendEmptyMessageDelayed(0,2000);
}
@Override
protectedvoidonAttachedToWindow(){
mStopMarquee=false;
if(!StringUtils.isEmpty(mText))
mHandler.sendEmptyMessageDelayed(0,2000);
super.onAttachedToWindow();
}
@Override
protectedvoidonDetachedFromWindow(){
mStopMarquee=true;
if(mHandler.hasMessages(0))
mHandler.removeMessages(0);
super.onDetachedFromWindow();
}
@Override
protectedvoidonDraw(Canvascanvas){
super.onDraw(canvas);
if(!StringUtils.isEmpty(mText))
canvas.drawText(mText,mCoordinateX,15,getPaint());
}
privateHandlermHandler=newHandler(){
@Override
publicvoidhandleMessage(Messagemsg){
switch(msg.what){
case0:
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实现跑马灯的实例代码,有需要的朋友可以参考下。