您的位置:首页 > 移动开发 > Android开发

android原生TextView怎么控制是否开始跑走马灯

2017-01-23 10:19 363 查看
在实际项目中,经常遇到文本超出控件宽度,显示不全,此时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;
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  android 控件 textview