Android监听TextView跑马灯的状态

    最近项目需要一个需求,要求在TextView跑马灯状态结束后隐藏整个控件。可惜android并没有提供这样接口来通知我们跑马灯状态是否结束,因此我们只能自己来做。最开始一点思路都没有,后来想了一个奇葩的办法:因为跑马灯在运动的时候,每次都会调用onDraw()方法,我想如果我在onDraw方法里面写一个计数器,然后通过计算计数器的次数来判断跑马灯是否结束,但是后来发现这个方法很不靠谱,因为我很难知道计数器数值到达哪个值 才算是结束。

    后来,我决定去看看源码,然后在源码里发现一个类:Marquee。这是一个内部类,其实就是一个Handler的子类,TextView如何实现跑马灯的我并不太清楚,但是这个内部类有一个字段是用来判断跑马灯状态的:mStatus。如果这个字段等于0的时候 说明处于停止状态 如果等于2的时候 才是运动状态。另外还有一个字段是跑马灯的计数器:

下面是反射的核心方法:

 <span style="white-space:pre">	</span>    Class<?> cls = textView.getClass();
            Field field = cls.getDeclaredField("mMarquee");
            field.setAccessible(true);
            Object mMarquee = field.get(textView);
            //这里需要注意的是 如果TextView没有跑马灯  也就是如果文字内容无法占满TextView时候 这个mMarquee对象就是<span style="white-space:pre">	</span>    //空的
            Class<?> cls2 = mMarquee.getClass();
            Field field2 = cls2.getDeclaredField("mStatus");
            field2.setAccessible(true);
            //下面这个就是跑马灯状态啦 当然 这个值是一个byte类型的 需要强制转换一下
            //另外如果需要获取mRepeatLimit 只需要这样改一下就行了:cls2.getDeclaredField("mRepeatLimit");
            Object mStatus = field2.get(mMarquee);
虽然,反射很早以前就看过了,不过一直没有实战过,这一次算是实战了一把,有点小收获。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值