Android監聽TextView跑馬燈的狀態
阿新 • • 發佈:2019-01-22
最近專案需要一個需求,要求在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);