• 【Android】不依赖焦点和选中的TextView跑马灯【2】


    前言

    之前有写一篇TextView跑马灯的效果,后来实际项目中有发现新的问题,比如还是无法自动跑,文本超过了显示区域就截取的问题,今天换了一种思路来实现,更简单更好用。 


    声明
    欢迎转载,但请保留文章原始出处:)

    博客园:http://www.cnblogs.com

    农民伯伯: http://over140.cnblogs.com 


    正文

    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替换成自己的判定方法即可。

       

  • 相关阅读:
    cd的使用
    转换器模式
    装饰模式
    策略模式
    模板方法模式
    工厂模式
    类型信息
    proto编译组件使用
    proto编译引用外部包问题
    Kafka经典三大问:数据有序丢失重复
  • 原文地址:https://www.cnblogs.com/over140/p/3687952.html
Copyright © 2020-2023  润新知