android textview跑马灯--marquee

在Android开发中,当TextView的ellipsize属性设置为marquee时,可以实现跑马灯效果。然而,当界面中有多个TextView需要此效果时,通常只有一个生效。通过自定义View继承TextView并重写isFocused方法返回true,可以解决这个问题。此外,还可以尝试重写isSelected方法返回false来验证解决方案。深入源码研究,可以了解更多的实现细节。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

在Android中,TextView本身有一个属性:

android:ellipsize="marquee"

当ellipsize属性为mqrquee时,当文字长度大于textview的长度时,TextView中的文字将会以跑马灯的方式显示(和银行门前LED灯的标志一样)。
一般情况下,直接设置上面的属性就可以了,但是,在一个界面中与多个TextView需要跑马灯效果时,只有一个会有效果。
针对这个问题,网络上有很多种解释,但是其中很多的解释让我云里雾是,昨天在随便翻翻我不知道从哪里下载的代码时,发现了一个做跑马灯的demo,其中解决了这个问题,解决方式如下:
1. 自定义view继承textview

public class MarqueTextView extends TextView {

    public MarqueTextView(Context context, AttributeSet attrs, int defStyle) {
        super(context, attrs, defStyle);
    }

    public MarqueTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    public MarqueTextView(Context context) {
        super(context);
    }

    @Override
    public boolean isFocused() {
        return true;
    }

}

在这个自定义的view中重写isFocused方法并返回true。
2. 在布局文件中使用并指定ellipsize属性为marquee即可。

<com.example.marquetextview.MarqueTextView
        android:id="@+id/tv_marque"
        android:singleLine="true"
        android:ellipsize="marquee"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:text="@string/hello_world" />

到这里问题就解决了,但是!why?
这里我做了一件让我豁然开朗的事情,command+单击,点进TextView的源码,搜索marquee,我看到了这样一段:

//TextView.Marquee.tick()
void tick() {
           ......
            if (textView != null && (textView.isFocused() || textView.isSelected())) {
            ......
                textView.invalidate();
            }
        }

OK,验证上面这一段代码是不是解决问题的方式很简单,将上面都的自定义TextView不重写isFocued方法,改而重写isSelected方法并返回false,看效果是不是多个TextView在滚动即可。
改完结果为:That is god damn OK。
继续查看源码,还可以查看到其他的一些源码,比如startMarquee方法等,但是我酝酿了好久,发现基于个人水平,不知道从何写起实在尴尬,就写这么多吧……

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值