首先,普通情况下
TextView
*聚焦状态下显示跑马灯文字效果需要
android:focusable=“true”
android:ellipsize=“marquee”
android:marqueeRepeatLimit=“marquee_forever”
android:scrollHorizontally=“true”
有时是不需要textview能获取焦点的,但同时要实现跑马灯效果
这个时候可以继承一下textview,重写isFocused()方法
使其返回true
使用时
maxEms指定文本超过几个大写M字母的宽度时开始跑马灯
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:maxEms="10"
android:singleLine="true"
有时textview是不能获取焦点的,但同时要实现焦点在textview父组件上时有跑马灯效果
这个时候可以继承一下textview,重写isFocused()方法
使其根据textview isSelected()的状态来返回true或false。如下:
public class MarqueeTextView extends AppCompatTextView {
public MarqueeTextView(Context context) {
super(context);
}
public MarqueeTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueeTextView(Context context, AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
if (isSelected()) {
return true;
}
return false;
}
}
在文本的父组件上根据焦点监听 控制文本的选中状态和 ellipsize, 实现跑马灯效果的跟随改变
binding!!.user.mine.cardWhole.setOnFocusChangeListener { v, hasFocus ->
// binding!!.user.mine.cardTitle.isSelected = hasFocus
if (hasFocus){
binding!!.user.mine.cardTitle.isSelected=true
binding!!.user.mine.cardTitle.ellipsize = TextUtils.TruncateAt.MARQUEE
}else{
binding!!.user.mine.cardTitle.isSelected=false
binding!!.user.mine.cardTitle.ellipsize = TextUtils.TruncateAt.END
}
}