参考网址:https://www.jianshu.com/p/e6c1b825d322
起初,使用了如下XML布局:
1 <TextView 2 android:id="@+id/tv_person_name" 3 android:layout_marginTop="16dp" 4 android:layout_width="125dp" 5 android:layout_height="wrap_content" 6 android:text="健康快乐的小..." 7 android:textSize="20sp" 8 android:textColor="#CE000000" 9 android:layout_alignParentLeft="true" 10 android:layout_marginLeft="85dp" 11 android:singleLine="true"//设置单行 12 android:ellipsize="marquee"//跑马灯 13 android:marqueeRepeatLimit="marquee_forever"//无限循环 14 android:focusable="true"//获得焦点 15 android:focusableInTouchMode="true" />
结果是:能暂时实现跑马灯效果,但在多次点击事件之后容易失焦。而且在Android4.4上实现有短暂停顿。
focusable和focusableInTouchMode的区别:https://blog.csdn.net/SylG17/article/details/85047234
曾尝试通过EvenBus重新获取焦点,但是并无卵用。
后来采用自定义跑马灯类:
1 public class MarqueeTextView extends AppCompatTextView { 2 /** 滚动次数 */ 3 private int marqueeNum = -1;//-1为永久循环,大于0是循环次数。` 4 public void setMarqueeNum(int marqueeNum) { 5 this.marqueeNum = marqueeNum; 6 } 7 public MarqueeTextView(Context context) { 8 super(context); 9 setAttr(); 10 } 11 public MarqueeTextView(Context context, AttributeSet attrs) { 12 super(context, attrs); 13 setAttr(); 14 } 15 public MarqueeTextView(Context context, AttributeSet attrs, int defStyle) { 16 super(context, attrs, defStyle); 17 setAttr(); 18 } 19 /** 20 * 始终获取焦点 21 * 跑马灯在TextView处于焦点状态的时候才会滚动 22 */ 23 @Override 24 public boolean isFocused() { 25 return true; 26 } 27 /** 28 * 设置相关属性 29 */ 30 private void setAttr(){ 31 this.setEllipsize(TextUtils.TruncateAt.MARQUEE);//设置跑马等效果 32 this.setMarqueeRepeatLimit(marqueeNum);//设置跑马灯重复次数 33 this.setSingleLine(true);//设置单行 34 } 35 }
采用自定义跑马灯控件:
1 <com.sz.cszj.intelligentrobot.cszjrobot.view.MarqueeTextView 2 android:id="@+id/tv_person_name" 3 android:layout_marginTop="16dp" 4 android:layout_width="125dp" 5 android:layout_height="wrap_content" 6 android:text="健康快乐的小..." 7 android:textSize="20sp" 8 android:textColor="#CE000000" 9 android:layout_alignParentLeft="true" 10 android:layout_marginLeft="85dp"/>
效果:不会失焦,能实现跑马灯效果。但是依然会有卡顿。