首页 > 代码库 > 浅谈TextView Ellipsize效果与跑马灯

浅谈TextView Ellipsize效果与跑马灯

说到TextView 效果,相信大家一定熟悉跑马灯。

先来看看 Ellipsize是什么,Ellipsize 从开发技术上翻译为省略效果。故名思议,就是当文本无法显示全部时,用什么效果来显示未显示的部分。

 

一,What is Ellipsize  and  How to use ?

首先我们在Android XML中需要这样定义

    <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="30dp"        android:text="@string/hello_world"  //全部文字为:Hello world!这是一个跑马灯专门用来测试的,所以字数一定要多,不过肯定超过15字了。                android:ellipsize="end"        android:singleLine="true"                        android:textSize="20sp"        />

 显示效果:

技术分享

可以看到在这段文字后面有三个"..."来表示这段话没有显示完毕,后面还有一部分。所以问题来了这个效果怎么来的呢?

 android:ellipsize="end" android:singleLine="true"

 起作用的就是这两行代码。

android:singleLine="true"用来指定当前TextView为单行显示,意思就是无论字数多少,都要一行来显示,这个也是显示Ellipsize效果的必须条件。

至于为什么需要android:singleLine="true"后面讲解源码会说到。我们再来看android:ellipsize这个属性。

它是由TextView中的一个枚举定义的,我们看看这个数据结构:

  public enum TruncateAt {        START,        MIDDLE,        END,        MARQUEE,        /**         * @hide         */        END_SMALL    }

 

 从枚举名TruncateAt的意思:在什么地方截断。顾名思义就是在TextView的内容中哪个位置显示截断效果。下面几个图分别代表每个变量的效果:

技术分享

TruncateAt.MARQUEE就是跑马灯效果。但是本该是一行文字从坐往右的滚动,但是实际上只添加

android:ellipsize="marquee"android:singleLine="true"

 

这两个属性,看到就是上图那个样子。仔细一点你会发现那个其实不是普通的效果:"来"字后半部有渐进透明,后面会讲解跑马灯效果不显示的原因。

其实在实际Android XML中还有一个属性android:ellipsize="none",这个意思是不指定省略效果:

技术分享

我们可以看到这段话多出了"测试"两个字,但是"试"被截断了。其实android:ellipsize的默认值为end。因为在TextView的构造函数中有这样一行代码:

   if (singleLine && getKeyListener() == null && ellipsize < 0) {                ellipsize = 3; // END        }

 

意思是即使你只设定了 android:singleLine="true"。那么也会显示android:ellipsize="end"时的效果。

 

 二,为什么跑马灯无效果?

对于这个问题,相比大家都知道,当我们写了如下代码时:

  <TextView        android:id="@+id/textView"        android:layout_width="wrap_content"        android:layout_height="30dp"        android:text="@string/hello_world"        android:ellipsize="marquee"        android:singleLine="true"        android:textSize="20sp"        />

 

却发现应用运行时跑马灯效果却没有。妈蛋,这是为毛。这个时候相比大家都能百度到解法。下面有两个网上最流行的解法

1.重写TextView

2.需要调用TextViews一大堆的函数。

起初我看到这个非常不爽,还能不能好好的玩耍了,妈蛋,android:ellipsize="start|middle|end"都能一行代码显示,为毛这个不行。想要知道问题原因很简单。

知道了why,你就知道了how。

 

谈到跑马灯,里面还是有点含量的。下面先介绍几个

 

浅谈TextView Ellipsize效果与跑马灯