在实际项目中,经常遇到文本超出控件宽度,显示不全,此时android提供了一个方法:
void android.widget.TextView.setEllipsize(TruncateAt where)
此方法意思就是设置文本超出宽度的展示效果。TruncateAt定义如下:
public static enum TruncateAt {
END,
MARQUEE,
MIDDLE,
START;
private TruncateAt() {
}
}
END: 表示在文本展示不全时候,在文本末尾显示省略号
MARQUEE: 表示在文本展示不全时候,以走马灯形式滚动
MIDDLE:表示在文本展示不全时候,在文本中间尾显示省略号
START:表示在文本展示不全时候,在文本开始处显示省略号
默认不设置,表示无以上效果。超出控件部分文字会被截断显示。
所以,可以使用null关闭ellipsize。即:
setEllipsize(null);
另外,以上属性设置是立即生效的。即如果文本是MARQUEEN,走马灯滚动状态,
如果设置为null时候,在滚动的走马灯马上会回到初始状态。且文本被截断。
如果设置为END,在滚动的走马灯会回到末尾有省略号的样式。
控制走马灯滚动可以如下设置:
// 开始滚动
public void startScroll() {
setEllipsize(TextUtils.TruncateAt.MARQUEE);
}
// 停止滚动,回到起点
public void stopScroll() {
setEllipsize(TextUtils.TruncateAt.END);或者setEllipsize(null);
}
android样进行走马灯滚动前提是该控件在焦点状态,且可以聚焦。但是很多时候文本不聚焦也需要滚动提示用户。
如果不自定义view,那么android系统的TextView怎么样才能达到效果呢?
答案就是复写TextView的isFocused方法:
//默认滚动
@Override
public boolean isFocused() {
return true;
}
另外,setSingleLine()或setHorizontallyScrolling(bool)来限制为单行文本。
如果setMaxLines(int)被用来设置两行或两行以上的文本,只有END和MARQUEE被ellipsize方法支持(其他ellipsiz类型将不会做任何事情)。
示列:
<?xml version="1.0" encoding="utf-8"?>
<FrameLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:orientation="vertical"
android:layout_width="match_parent"
android:layout_height="match_parent"
>
<com.starcor.hunan.MarqueeTextView
android:id="@+id/textView"
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:maxLines="1"
android:scrollHorizontally="true"
android:layout_centerInParent="true"
android:singleLine="true"
android:textColor="#ff0000"
android:focusable="true"
android:textSize="24px"
android:marqueeRepeatLimit="marquee_forever"
android:focusableInTouchMode="true"/>
</FrameLayout>
public class MarqueeTextView extends TextView{
public MarqueeTextView(Context context) {
super(context);
}
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
init();
}
public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
init();
}
private void init() {
this.setScrollbarFadingEnabled(true);
this.setHorizontallyScrolling(true);
this.setHorizontalFadingEdgeEnabled(true);
this.setSingleLine(true);
this.setFocusable(true);
this.setMarqueeRepeatLimit(-1);
this.setMaxLines(1);
}
@Override
public boolean isFocused() {
return true;
}
}