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

       

  • 相关阅读:
    [mybatis] expression: in.showLayers==true [org.apache.ibatis.ognl.ParseException: Encountered “ “in“
    IDEA pom中引用本地lib下的jar包
    IDEA Error:java xxxx 程序包不存在
    Spring注解 @NotBlank,@NotNull,@NotEmpty三者之间的区别
    [Vue warn]: Invalid prop: type check failed for prop “disabled“. Expected Boolean, got String
    centos7设置nginx开机自启
    centos7 源码安装redis设置开机自启
    MybatisPlus java.lang.NoClassDefFoundError: org/apache/velocity/context/Context
    /usr/share/rubygems/rubygems/core_ext/kernel_require.rb:55:in `require': cannot load such file -- redis (LoadError)
    No Identifier specified for entity的解决办法《转载》
  • 原文地址:https://www.cnblogs.com/over140/p/3687952.html
Copyright © 2011-2022 走看看