由于传统TextView实现的跑马灯效果会受限于焦点,无法实现多个TextView同时有跑马灯效果,通过继承TextView实现方法来变现达到效果
不过测试的时候发现,好像弹个窗也会中断跑马灯效果?不确定是不是自己的用法不对
import android.annotation.SuppressLint
import android.content.Context
import android.util.AttributeSet
import android.widget.TextView
/**
* 实现跑马灯效果的TextView
*/
@SuppressLint("AppCompatCustomView")
class MarqueeTextView : TextView {
private var mNeedFocus = true
constructor(context: Context?) : super(context)
constructor(context: Context?, attrs: AttributeSet?) : super(context, attrs)
constructor(context: Context?, attrs: AttributeSet?, defStyleAttr: Int) : super(
context,
attrs,
defStyleAttr
)
//返回 TextView 是否处在选中的状态 , 而只有选中的 TextView 才能够实现跑马灯效果
//等效于 xml 中 <requestFocus />
override fun isFocused(): Boolean {
return true
//if (mNeedFocus) {
// return false
//}
//return super.isFocused()
}
fun setNeedFocus(needFocus: Boolean) {
mNeedFocus = needFocus
}
}
使用(下面列出的是必要设置的属性)
<atute.yelike.micplay.view.MarqueeTextView
...
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:lines="1"
android:maxLines="1"
...
/>
这里我没有再次封装了,也可以将上面的必要属性写在代码中,这样使用的时候就不用再xml再进行设置了
评论区