TextView 实现跑马灯显示效果
一、对于一个TextView只需要设置三个条件
1、android:ellipsize=”marquee”
2、TextView必须单行显示,即内容必须超出TextView大小
3、TextView要获得焦点才能滚动
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="这是一个长TextView,这是一个长TextView,这是一个长TextView,这是一个长TextView。" />
二、但当有多个控件同时需要实现该效果的时候上面的方法就不管用了
这时,只有第一个TextView正常显示
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="这是一个长TextView,这是一个长TextView,这是一个长TextView,这是一个长TextView。" />
<TextView
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="这是一个长TextView,这是一个长TextView,这是一个长TextView,这是一个长TextView。" />
效果如图,只有第一个TextView会滚动
因为第二个TextView它获取不到焦点了。
三、所以就需要自定义一个MarqueeText类,继承TextView,
并且重写isFocuse()方法,让它永远返回true,用MarqueeText实现TextView的功能,这样跑马灯效果就能一直的跑起来了。
//class MarqueeText
public class MarqueeText extends android.support.v7.widget.AppCompatTextView {
public MarqueeText(Context context) {
super(context);
}
public MarqueeText(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeText(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;
}
}
//XML
<com.example.chenjipayne.a003.MarqueeText//MarqueeText前需要加包名
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="这是一个长TextView,这是一个长TextView,这是一个长TextView,这是一个长TextView。" />
<com.example.chenjipayne.a003.MarqueeText
android:id="@+id/textView1"
android:layout_width="wrap_content"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:singleLine="true"
android:marqueeRepeatLimit="marquee_forever"
android:text="这是一个长TextView,这是一个长TextView,这是一个长TextView,这是一个长TextView。" />
运行结果