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;

                                            }
                                        }
                                    });

帮助到各位新萌 请给我点个关注    

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

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值