public class wxMarQueeText extends android.support.v7.widget.AppCompatTextView {
private Paint paint;
private String mText;
private Rect rect;
private float offX = 0;
private float mStep = 2;
private int scrollNum = 0;
public wxMarQueeText(Context context) {
super(context);
setSingleLine(true);
}
public wxMarQueeText(Context context, AttributeSet attrs) {
super(context, attrs);
setSingleLine(true);
}
public wxMarQueeText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
setSingleLine(true);
}
@Override
protected void onMeasure(int widthMeasureSpec, int heightMeasureSpec) {
mText = getText().toString();
paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setColor(getCurrentTextColor());
paint.setTextAlign(Paint.Align.LEFT);//默认text中心是文字左边,Center是设定初始位置是文字中心
paint.setTextSize(getTextSize());
rect = new Rect();
paint.getTextBounds(mText, 0, mText.length(), rect);
}
@Override
protected void onDraw(Canvas canvas) {
if (rect.width() + 10 < getMeasuredWidth()) {//这么做是为了保证text绘制的准确
int left = getMeasuredWidth() / 2 - rect.width() / 2; //当文字长度小于整体长度,此时不进行跑马灯效果处理,将其位置设定在中间。left: 文字距本身左边的长度
canvas.drawText(mText, left, getMeasuredHeight() / 2 + (paint.descent() - paint.ascent() / 2), paint);
return;
}
float x, y;
x = getMeasuredWidth() - offX;
y = getMeasuredHeight() / 2 + (paint.descent() - paint.ascent() / 2);
canvas.drawText(mText, x, y, paint);
offX += mStep;
if (offX > getMeasuredWidth() + rect.width()) {
offX = 0;
}
//仿照textView Marquee效果,靠边悬停,第一次不悬停。scrollNum是判断是否是第一次到最左边。
if (x < mStep && x >= 0 && scrollNum < 1) {
scrollNum++;
invalidate();
} else if (x < mStep && x >= 0) {
postInvalidateDelayed(5000);//悬停5s
} else {
invalidate();
}
}