为什么使用跑马灯效果?
经常使用TextView会出现这样的情况,有限的空间内只能写一行,然后导致好多文字被“...”表示了 而且有可能是重要信息被隐藏了,于是就有了跑马灯效果.
什么是TextView跑马灯?
TextView的跑马灯效果也就是指当你只想让TextView单行显示,可是文本内容却又超过一行时,自动从左往右慢慢滑动显示的效果就叫跑马灯效果.
一、使用TextView属性来实现
1.布局文件 直接在布局设置数据
<TextView android:id="@+id/marquee_tv" android:layout_width="match_parent" android:layout_height="match_parent" android:drawableLeft="@drawable/icon" android:drawablePadding="12dp" android:ellipsize="marquee" android:gravity="center_vertical" android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="这个项目的作用就是让这个单行的很长很长的单独一行的TextView实现跑马灯的效果" android:textSize="22sp"/>
2.
或者java代码设置数据:
marqueeTv.setText("xxxx..."); marqueeTv.setFocusable(true); // 获取焦点 marqueeTv.setFocusableInTouchMode(true); marqueeTv.requestFocus();
但是这种方法在有两个TextView的时候不能给两个TextView同时实现跑马灯的效果。
原因:
TextView默认的isFocused()方法默认只能给一个对象实现focused。
解决的办法:
新建一个类MarqueeTextView继承TextView,
让他的isFocused()方法返回true。
注意:子类MarqueeTextView需要实现父类的所有3个构造函数,
不然会有问题
效果:
二、使用自定义View实现
1.自定义一个类,继承TextView并重写isFocused方法,返回true,让其获取焦点
public class MarqueeView extends TextView { //实现TextView的三个构造函数 public MarqueeView( Context context ) { super( context ); } public MarqueeView( Context context, AttributeSet attrs ) { super( context, attrs ); } public MarqueeView( Context context, AttributeSet attrs, int defStyleAttr ) { super( context, attrs, defStyleAttr ); } //重写isFocused()方法 @Override public boolean isFocused() { return true; }}
2.布局文件中使用 将XML文件中默认的TextView控件换成自定义的TextView,
方法是:包名+类名
<com.p.h.MarqueeView android:layout_width="match_parent" android:layout_height="match_parent" android:ellipsize="marquee" android:focusable="true" android:focusableInTouchMode="true" android:gravity="center_vertical" android:scrollHorizontally=“true” android:marqueeRepeatLimit="marquee_forever" android:singleLine="true" android:text="跑马灯,我来了,大辉儿!大辉儿!大辉儿!大辉儿!大辉儿!大辉儿!" android:textColor="@color/blue" android:textSize="25sp"/>
3.属性介绍
marqueeRepeatLimit
表示跑马灯循环的次数,
android:singleLine="true"
限制TextView单行显示,避免换行
android:ellipsize="marquee"
以横向滚动方式显示(需要获取当前焦点)
android:focusable="true"
获取焦点
android:focusableInTouchMode="ture"
触屏模式下可获得焦点
marquee_forever
表示一直循环,也可以写个数字表示次数然后Activity中可以使设置其setText就ok了;
scrollHorizontally
表示滚动的方向是否为水平方向; 到这里就结束啦。