Android監聽TextView跑馬燈的狀態

2021-07-04 18:07:32 字數 1054 閱讀 6177

最近專案需要乙個需求,要求在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 自定義控制項繼承TextView

在原生控制項上進行擴充套件,增加新的功能 一般是在ondraw 方法中對原生控制項進行擴充套件 下面以乙個textview 為例,來看看如何使用擴充套件原生控制項的方法建立新的控制項 對現有控制項進行擴充套件 public class m textview extends textview publ...

Android 使用者介面設計之TextView

2.文字的鏈結 將文字中的 號碼,email url layout 中的xml 檔案中進行新增 另一種是在 activity 的oncreate 方法中新增 xml檔案設定 all,map,none,email,phone 以及web 在這我們以設定為 phone 為例。號碼不是尚矽谷老師的,隨便編...

Android 使用者介面設計之TextView

5.富文字 先說一下什麼是富文字,富文字就是對文字中一些特殊文字或者的特殊顯示。例如我們我們發一段話 你還沒有還我 100塊錢。這句話我們要強調 100塊錢 這是後我們可以把它顯示為特殊的顏色,這其實就是一種富文字。有時候我們 qq聊天經常發表情,其實這也是一種富文字。富文字,可以支援一部分的 ht...