textview设置文字后跑马灯不走终极解决办法,外加跑马灯状态回调

百度上跑马灯的效果太多了 但能点进这篇博客一定是跑不起来 我这几天也做了个跑马灯效果 没有努力读源码 所以遇到了不少坑 这里简单给大家介绍一下

首先 

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;

                                            }
                                        }
                                    });

帮助到各位新萌 请给我点个关注    鸿洋android技术qq群591683946 

本人表示已经不使用自带的了  gethub上大神实在是多 提供一个连接 个人觉得很牛终极跑马灯效果

猜你喜欢

转载自blog.csdn.net/qq_34468274/article/details/82181666