第一种方式:在布局文件中设置focusable和focusableInTouchMode为true后即可实现跑马灯效果。
<TextView
android:id="@+id/tv_marquee"
android:layout_width="100dp"
android:layout_height="wrap_content"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
android:focusableInTouchMode="true"
android:text="测试跑马灯效果,设置focusableInTouchMode"
/>
第二种方式:
自定义MarqueeTextView,重写isFoucused()方法,强制返回true。TextView只有获得焦点才能实现跑马灯效果
自定义MarqueeTextView代码如下:
package com.example.myapplication;
import android.content.Context;
import android.util.AttributeSet;
public class MarqueeTextView extends androidx.appcompat.widget.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() {
return true;
}
}
需要设置ellipsize属性为"marquee",同时设置单行显示,marqueeRepeatLimit属性设置循环次数,"marquee_forever"为无效循环。
<com.example.myapplication.MarqueeTextView
android:layout_width="100dp"
android:text="测试跑马灯效果,自定义MarqueeTextView"
android:singleLine="true"
android:textColor="@android:color/black"
android:layout_height="wrap_content"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"
android:focusable="true"
/>
TextView需要获得焦点才能有跑马灯效果,当获取不到焦点则无跑马灯效果。