Android自带的跑马灯效果文字长度没有超过屏幕的话不会滚动,但是我们这边产品需求是文字长度没有超过屏幕长度也需要滚动,我看了一个人的博客上实现了Android跑马灯的效果从他博客上获得了灵感,自己改动了一下。其实很简单就是利用handler循环发送消息,不断的调用invalidate()方法drawText从而达到文字滚动的效果。关键地方是当文字整个移出屏幕时我们需要吧x坐标置为屏幕宽度,这样文字才能循环滚动。
public class MarqueeTextView extends TextView { /** 是否停止滚动 */ private boolean mStopMarquee; private String mText; private float mCoordinateX; private float mTextWidth; private float windowWith; public MarqueeTextView(Context context, AttributeSet attrs) { super(context, attrs); } public void setText(String text) { this.mText = text; mTextWidth = getPaint().measureText(mText); DisplayMetrics displayMetrics = getResources().getDisplayMetrics(); windowWith = displayMetrics.widthPixels; if (mHandler.hasMessages(0)) mHandler.removeMessages(0); mHandler.sendEmptyMessageDelayed(0, 2000); } @SuppressLint("NewApi") @Override protected void onAttachedToWindow() { mStopMarquee = false; if (!(mText == null || mText.isEmpty())) mHandler.sendEmptyMessageDelayed(0, 2000); super.onAttachedToWindow(); } @Override protected void onDetachedFromWindow() { mStopMarquee = true; if (mHandler.hasMessages(0)) mHandler.removeMessages(0); super.onDetachedFromWindow(); } @SuppressLint("NewApi") @Override protected void onDraw(Canvas canvas) { super.onDraw(canvas); if (!(mText == null || mText.isEmpty())) canvas.drawText(mText, mCoordinateX, 30, getPaint()); } @SuppressLint("HandlerLeak") private Handler mHandler = new Handler() { @Override public void handleMessage(Message msg) { super.handleMessage(msg); switch (msg.what) { case 0: if(mCoordinateX < 0 && Math.abs(mCoordinateX) > mTextWidth){ mCoordinateX = windowWith; }else{ mCoordinateX -= 1; } invalidate(); sendEmptyMessageDelayed(0,30); break; } } }; }