今天練習的時候想實現一個文字的跑馬燈效果,原本想本身手動實現的,不過忽然想起來android裏的TextView屬性彷佛自帶了這個效果,叫: android:ellipsize ,平時都是把它的屬性值設置成 end ,表示文字超出了必定的範圍就顯示省略號,若是要實現跑馬燈的效果,就須要將它的屬性值設置成 marquee ,就是: android:ellipsize="marquee" 。我只記得它有這麼個屬性值,可是歷來沒用過,今天真正用了一次才發現這個屬性值並無那麼簡單:html
按照慣例,通常用到這個屬性值,就說明文字的長度超過了TextView的長度,並且通常都是在單行文本中進行滾動顯示的。因此我先將TextView的屬性設置以下:android
<TextView android:layout_width="100dip" android:layout_height="wrap_content" android:text="請使用手機掃描二維碼,而後鏈接設備請使用二維碼掃描手機,而後鏈接設備請使用二維碼掃描手機,而後鏈接設備請使用二維碼掃描手機,而後鏈接設備" android:ellipsize="marquee" android:singleLine="true" />
按照個人理解,文本長度是確定會超過TextView的顯示長度的,而我也確實將TextView設置成單行, android:ellipsize 的屬性值指定爲 marquee 了,但遺憾的是在手機上跑起來並無任何的效果。沒辦法,只能求教於百度,網上的說法有不少,大概有如下幾種:dom
第一種作法:新建一個繼承於TextView的自定義View,重寫其方法spa
參考連接:https://blog.csdn.net/shanshan_1117/article/details/78616901.net
這種方法我沒有試,或許可行,但我很不喜歡,既然android自帶了這個屬性,直接用這個屬性就行了,爲了實現一個效果(這個效果仍是系統自帶的)還要去新建一個View,得不償失。code
第二種作法:在xml文件中指定 android:textIsSelectable="true" 或是在代碼中設置 setSelected(true)xml
參考連接:https://www.cnblogs.com/ufreedom/p/4248142.htmlhtm
這位博主寫了不少,也分析了不少,最終結論就是上面的兩種辦法,說實話我挺佩服他的,能鑽研的這麼細(換作是我可能就自定義一個View了。。。我也只是在實在沒辦法的時候纔去看源碼),因而照着他的辦法試了下,給TextView添加了 android:textIsSelectable="true" 屬性,滿心歡喜的跑了一下看了下效果,結果仍是沒有用。。。也許這位博主的辦法確實有用,只是個人手機太特殊了(華爲P10)。blog
第三種作法:在xml文件中同時指定 android:focusable="true" 和 android:focusableInTouchMode="true" 繼承
參考連接:http://www.javashuo.com/article/p-xoojbbay-ge.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手機衆多,我也不敢保證本身的作法必定在全部的手機上都有效。