今天練習的時候想實現一個文字的跑馬燈效果,本來想自己手動實現的,不過突然想起來android里的TextView屬性似乎自帶了這個效果,叫: android:ellipsize ,平時都是把它的屬性值設置成 end ,表示文字超出了一定的范圍就顯示省略號,如果要實現跑馬燈的效果,就需要將它的屬性值設置成 marquee ,就是: android:ellipsize="marquee" 。我只記得它有這么個屬性值,但是從來沒用過,今天真正用了一次才發現這個屬性值並沒有那么簡單:
按照慣例,一般用到這個屬性值,就說明文字的長度超過了TextView的長度,而且一般都是在單行文本中進行滾動顯示的。所以我先將TextView的屬性設置如下:
<TextView android:layout_width="100dip" android:layout_height="wrap_content" android:text="請使用手機掃描二維碼,然后連接設備請使用二維碼掃描手機,然后連接設備請使用二維碼掃描手機,然后連接設備請使用二維碼掃描手機,然后連接設備" android:ellipsize="marquee" android:singleLine="true" />
按照我的理解,文本長度是肯定會超過TextView的顯示長度的,而我也確實將TextView設置成單行, android:ellipsize 的屬性值指定為 marquee 了,但遺憾的是在手機上跑起來並沒有任何的效果。沒辦法,只能求教於百度,網上的說法有很多,大概有以下幾種:
第一種做法:新建一個繼承於TextView的自定義View,重寫其方法
參考鏈接:https://blog.csdn.net/shanshan_1117/article/details/78616901
這種方法我沒有試,或許可行,但我很不喜歡,既然android自帶了這個屬性,直接用這個屬性就好了,為了實現一個效果(這個效果還是系統自帶的)還要去新建一個View,得不償失。
第二種做法:在xml文件中指定 android:textIsSelectable="true" 或是在代碼中設置 setSelected(true)
參考鏈接:https://www.cnblogs.com/ufreedom/p/4248142.html
這位博主寫了很多,也分析了很多,最終結論就是上面的兩種辦法,說實話我挺佩服他的,能鑽研的這么細(換做是我可能就自定義一個View了。。。我也只是在實在沒辦法的時候才去看源碼),於是照着他的辦法試了下,給TextView添加了 android:textIsSelectable="true" 屬性,滿心歡喜的跑了一下看了下效果,結果還是沒有用。。。也許這位博主的辦法確實有用,只是我的手機太特殊了(華為P10)。
第三種做法:在xml文件中同時指定 android:focusable="true" 和 android:focusableInTouchMode="true"
參考鏈接:https://www.cnblogs.com/Gaojiecai/p/3142783.html
這位博主同樣也寫了很多,也列舉了好幾種情況,有些辦法甚至於還要在TextView上加 android:clickable="true" ,感覺怪怪的,我在手機上跑了下,同樣也不行,無法實現跑馬燈的效果。但是,需要特別說明的是,這種辦法其實是有效的,如果直接在手機上跑,跑馬燈效果確實是沒有,但我手頭剛好有一個USB口的遙控器,可以通過上下導航鍵選中到TextView,如果是通過遙控器上的上下導航鍵選中這個TextView,那么這個TextView的跑馬燈效果就顯示出來了,但是我們用的是手機,進來的時候就要顯示。
其它做法:在代碼中對TextView進行修改
這種做法的鏈接就不貼了,網上有很多,但還是那個問題,設置一個TextView的效果,還要分別在XML和代碼中分別定義,個人實在是不喜歡。
我的做法:
仔細看了下第三種做法中博主的描述,大概覺得,要想使TextView擁有跑馬燈的效果,那么這個TextView就一定要能夠獲取到焦點,於是我在它的做法上進行了修改:
<TextView android:layout_width="200dip" android:layout_height="wrap_content" android:text="請使用二維碼掃描手機,然后連接設備請使用二維碼掃描手機,然后連接設備請使用二維碼掃描手機,然后連接設備請使用二維碼掃描手機,然后連接設備" android:ellipsize="marquee" android:singleLine="true" android:focusableInTouchMode="true" > <requestFocus/> </TextView>
再次運行試了下,跑馬燈效果有了:
我反復試了下,這個 android:focusableInTouchMode="true" 屬性是必須的, android:focusable="true" 屬性卻不是必須的。
最后,需要聲明下,我也只是在我的手機下(華為P10)運行通過,別的手機我沒有試過,我相信上面的幾位博主肯定也是在各自的手機上試過了才會發表博文的,android手機眾多,我也不敢保證自己的做法一定在所有的手機上都有效。