百度上跑马灯的效果太多了 但能点进这篇博客一定是跑不起来 我这几天也做了个跑马灯效果 没有努力读源码 所以遇到了不少坑 这里简单给大家介绍一下
首先
android:ellipsize="marquee" 跑马灯效果
android:marqueeRepeatLimit="marquee_forever" 无限循环效果
pm_tv.setSingleLine(true);//设置单行显示
pm_tv.setHorizontallyScrolling(true);//横向滚动
pm_tv.setMarqueeRepeatLimit(1);滚动一次-1是无线滚动
pm_tv.setSelected(true);//开始滚
上面这些都是基础 大家 应该都懂 接下来说坑
1.textview必须获得焦点才可以跑
@Override
public boolean isFocused() {
return true;
}
2.textview 文字不能显示多行
pm_tv.setSingleLine(true);
3.必须设置textview的宽度才可以跑
android:layout_width="100dp"
4.需要显示文字的宽度不得小于控件的宽度!
if(msgs.length() <= pm_tv.length())
5.文字的长度要使用物理长度判断 比如空格在textview上跟文字或者数字 占的宽度不一样,要使用占比宽度 只要这行显示不玩 就可以滚动
下面给大家提供一个监听方法
public class ScrollingTextView extends android.support.v7.widget.AppCompatTextView {
public static final byte MARQUEE_STOPPED = 0x0;
public static final byte MARQUEE_STARTING = 0x1;
public static final byte MARQUEE_RUNNING = 0x2;
private byte mCurrentStatus = MARQUEE_STOPPED;
public ScrollingTextView(Context context) {
super(context);
}
public ScrollingTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public ScrollingTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;
}
@Override
protected void onDraw(Canvas canvas) {
super.onDraw(canvas);
byte newState = getState();
if (mCurrentStatus != newState && onScrollingStateChangedListener != null) {
onScrollingStateChangedListener.onStateChanged(mCurrentStatus = newState);
}
}
private byte getState() {
try {
Field marquee = TextView.class.getDeclaredField("mMarquee");
marquee.setAccessible(true);
Object marqueeObject = marquee.get(this);
Field status = marqueeObject.getClass().getDeclaredField("mStatus");
status.setAccessible(true);
return (byte) status.get(marqueeObject);
} catch (Exception e) {
e.printStackTrace();
return MARQUEE_STOPPED;
}
}
private OnScrollingStateChangedListener onScrollingStateChangedListener;
public void setOnScrollingStateChangedListener(OnScrollingStateChangedListener listener) {
onScrollingStateChangedListener = listener;
}
public interface OnScrollingStateChangedListener {
void onStateChanged(byte state);
}
}
监听方法
pm_tv.setOnScrollingStateChangedListener(new ScrollingTextView.OnScrollingStateChangedListener() {
@Override
public void onStateChanged(byte state) {
switch (state) {
case ScrollingTextView.MARQUEE_RUNNING:
//开始
break;
case ScrollingTextView.MARQUEE_STARTING:
//执行
break;
case ScrollingTextView.MARQUEE_STOPPED:
//结束
break;
}
}
});
帮助到各位新萌 请给我点个关注
本人表示已经不使用自带的了 github上大神实在是多 提供一个连接 个人觉得很牛终极跑马灯效果