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