跑马灯的一些使用心得

本文详述了Android中跑马灯的使用,包括原生跑马灯的实现条件,如单行显示、焦点获取和内容长度等。讨论了在布局和焦点问题上可能导致跑马灯失效的原因,并提供了自定义跑马灯的实现方式,以实现更灵活的控制。同时分享了在复杂布局中遇到的坑,如布局高度对跑马灯的影响,以及解决方案。
摘要由CSDN通过智能技术生成

By Pheobe.liu

前言

在项目开发过程中,有时候应用涉及多语言,时常会出现内容过长而溢出的问题,例如某些爬虫语言,所以有些地方就考虑用跑马灯来呈现,此外某些特殊应用也会考虑使用跑马灯来增加用户体验。在这里归纳下自己看的一些文章以及google 原生对跑马灯的定义,并谈下使用的一些体会。

原生定义跑马灯

首先说下google自带跑马灯效果,根据google 关于textView 源码可以查看启动自带跑马灯条件:
private void startMarquee() {
        // Do not ellipsize EditText
        if (getKeyListener() != null) return;

        if (compressText(getWidth() - getCompoundPaddingLeft() - getCompoundPaddingRight())) {
            return;
        }

        if ((mMarquee == null || mMarquee.isStopped()) && (isFocused() || isSelected()) &&
                getLineCount() == 1 && canMarquee()) {

            if (mMarqueeFadeMode == MARQUEE_FADE_SWITCH_SHOW_ELLIPSIS) {
                mMarqueeFadeMode = MARQUEE_FADE_SWITCH_SHOW_FADE;
                final Layout tmp = mLayout;
                mLayout = mSavedMarqueeModeLayout;
                mSavedMarqueeModeLayout = tmp;
                setHorizontalFadingEdgeEnabled(true);
                requestLayout();
                invalidate();
            }

            if (mMarquee == null) mMarquee = new Marquee(this);
            mMarquee.start(mMarqueeRepeatLimit);
        }
    }

 private boolean canMarquee() {
        int width = (mRight - mLeft - getCompoundPaddingLeft() - getCompoundPaddingRight());
        return width > 0 && (mLayout.getLineWidth(0) > width ||
                (mMarqueeFadeMode != MARQUEE_FADE_NORMAL && mSavedMarqueeModeLayout != null &&
                        mSavedMarqueeModeLayout.getLineWidth(0) > width));
    }

根据条件可以看到要启动跑马灯需要如下几个条件:

  • TextView 应该单行显示
  • TextView 内容长度要长于textView 设定的Layout宽度,如果更短就没有跑马灯的意义
  • android:ellipsize=”marquee”也可以用代码来设定
  • 对应的TextView 要获取的到焦点或者被选中

对应的可以参考在XML 文件中设定如下

<TextView  
        android:layout_width="100dip"  
        android:layout_height="50dip" 
        android:text="我得意的笑我得意的笑我得意地笑"   
        android:singleLine="true"  
        android:ellipsize="marquee"  
        android:focusable="true"  
        android:focusableInTouchMode="true"  
        ></TextView> 

针对上述给的几个条件可能有些读者会存在误区,我们一一拆解了看:

  1. TextView 应该单行显示
    看标题的话,我们知道单行显示有两种设置都可以达到效果:android:singleLine=”true”和android:maxLines=”1”。但实际上设置maxLine 对跑马灯来说是无效的。在这里简单说明下关于singleLine和maxLine的区别。官方对两者的定义是:
    maxLines:限制TextView的最高高度,就是指通过限制行数来限制最高高度。
    singleLine: 强制设置TextView的文字不换行。
    区别就是:maxLines还是会默认执行自动换行策略,假如一段文字自动换行后有5行,maxLines设置为1行,那么就只显示第一行的内容,其他行不显示。但是,如果设置了singleLine, 那么这段可以有5行的文字将会被强制放在1行里,然后看最多能显示多少字符,剩下的不显示.由此也就明白
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值