zoukankan      html  css  js  c++  java
  • 【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替换成自己的判定方法即可。

       

  • 相关阅读:
    字节码编程,Javassist篇四《通过字节码插桩监控方法采集运行时入参出参和异常信息》
    字节码编程,Javassist篇三《使用Javassist在运行时重新加载类「替换原方法输出不一样的结果」》
    字节码编程,Javassist篇二《定义属性以及创建方法时多种入参和出参类型的使用》
    字节码编程,Javassist篇一《基于javassist的第一个案例helloworld》
    CPU瞒着内存竟干出这种事
    可怕!CPU竟成了黑客的帮凶!
    完了!CPU一味求快出事儿了!
    如果平行宇宙也有编程语言
    你离黑客的距离,就差这20个神器了
    哈希表哪家强?几大编程语言吵起来了!
  • 原文地址:https://www.cnblogs.com/over140/p/3687952.html
Copyright © 2011-2022 走看看