自定义跑马灯TextView

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_36791265/article/details/80322131
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();
        }
    }

猜你喜欢

转载自blog.csdn.net/qq_36791265/article/details/80322131