跑马灯的记录
Android跑马灯的实现很简单,有android系统提供的api就可以实现。问题在于在实际的手机上运行的时候,有一些手机可以有效果,有一些手机没效果。所以这个问题可能每个人遇到的情况不一样,我这里说说我遇到的情况的解决办法,不一定对你有用,但是我用了之后,是解决了。
解决方法
1.xml布局文件
<com.flj.latte.ec.widget.MarqueTextView
android:id="@+id/item_control_marquee"
android:layout_width="match_parent"
android:layout_height="match_parent"
android:layout_below="@+id/linearLayoutCompat"
android:singleLine="true"
android:ellipsize="marquee"
android:focusable="true"
android:focusableInTouchMode="true"
android:marqueeRepeatLimit="marquee_forever"
android:scrollHorizontally="true"
android:visibility="visible"
android:layout_gravity="center_vertical"
android:gravity="center_vertical"
android:textSize="12sp"
android:textColor="@color/ec_color_7A7A7A"
>
<requestFocus/>
</com.flj.latte.ec.widget.MarqueTextView>
2.自己写一个自定义view
public class MarqueTextView extends androidx.appcompat.widget.AppCompatTextView {
private boolean isMarqueeEnable = false;
public MarqueTextView(Context context, AttributeSet attrs, int defStyle) {
super(context, attrs, defStyle);
}
public MarqueTextView(Context context, AttributeSet attrs) {
super(context, attrs);
}
public MarqueTextView(Context context) {
super(context);
}
@Override
public boolean isFocused() {
return true;
}
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
super.onFocusChanged(focused, direction, previouslyFocusedRect);
}
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
super.onWindowFocusChanged(hasWindowFocus);
}
public void setMarqueeEnable(boolean enable) {
if (isMarqueeEnable != enable) {
isMarqueeEnable = enable;
if (enable) {
setEllipsize(TextUtils.TruncateAt.MARQUEE);
} else {
setEllipsize(TextUtils.TruncateAt.END);
}
onWindowFocusChanged(enable);
}
}
public boolean isMarqueeEnable() {
return isMarqueeEnable;
}
}
3.调用的地方
我延时了0.5秒去请求控件获取焦点,然后解决了跑马灯失效的问题。特别是切换页面的时候。
Observable.just("Amit")
//延时两秒,第一个参数是数值,第二个参数是事件单位
.delay((long) 0.5, TimeUnit.SECONDS)
.subscribeOn(Schedulers.io())
.observeOn(AndroidSchedulers.mainThread())
.subscribe(new Consumer<String>() {
@Override
public void accept(String s) throws Exception {
marqueeView.setSelected(true);
marqueeView.setMarqueeEnable(true);
marqueeView.requestFocus();
}
});
4.如果还是不行,可以试试其他人写的三方库。
https://github.com/AnyLifeZLB/ScrollTextView