1. 程式人生 > >Android監聽TextView跑馬燈的狀態

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);
雖然,反射很早以前就看過了,不過一直沒有實戰過,這一次算是實戰了一把,有點小收穫。