欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  移动技术

Android 实现不依赖焦点和选中的TextView跑马灯

程序员文章站 2024-03-06 09:31:31
前言  之前有写一篇textview跑马灯的效果,后来实际项目中有发现新的问题,比如还是无法自动跑,文本超过了显示区域就截取的问题,今天换了一种思路来实现,更简...

前言

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

正文

        代码实现:

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

以上就是android 实现跑马灯的实例代码,有需要的朋友可以参考下。