Android监听TextView跑马灯的状态

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

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

下面是反射的核心方法:

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

你可能感兴趣的:(Android知识)