1. 程式人生 > >關於Android實現TextView跑馬燈效果

關於Android實現TextView跑馬燈效果

在xml屬性中設定

<TextView
    android:width="wrap_content"
    android:height="wrap_content"
    android:singleLine="true"
    android:ellipsize="marquee"
    android:marqueeRepeatMode="marquee_forever"
    android:textSize="16sp"
    android:maxEms="5"
    android:text="內容長度一定要超過控制元件的長度"/>

解釋下上面的幾個屬性,實現跑馬燈效果

的重要屬性有兩條

要實現跑馬燈效果必須將當前TextView設定成單行顯示

    android:singleLine="true"
    /*值得一提的是,現在的singleLine已經被官方廢棄,
      改用maxLines來代替,
      但經過測試,要實現跑馬燈效果,仍然需要使用singleLine 
      */

然後將TextView的省略模式設定為marquee(滾動顯示),這裡說明下ellipsize屬性的幾種模式,start(省略前面的部分)、middle(省略中間的部分)、end(省略後面的部分)、marquee(滾動顯示)

    android:ellipsize="marquee"

實際上,上面兩條設定已經實現了跑馬燈效果,但實際測試卻會發現並沒有滾動顯示,這是因為要讓TextView“跑”起來必須要先滿足它的“虛榮心”。

什麼叫“虛榮心”呢?簡單來說,就是讓它知道,我們現在在看它,這裡有兩種方法,一種方法是給它焦點,一種方法是告訴它我們選中它了。

在這裡我們先分析下focusable和selected兩種狀態了。不要混淆它們,如果你經常使用selector的話,你應該知道,它們代表兩種不同的狀態。

從字面上看,focusable代表的屬性指是否獲取到焦點,而selected代表的屬性指是否選中,但這裡要注意的有兩個方面:

第一:focusable設定為true時,並不代表控制元件獲取到了焦點,而是代表控制元件可以獲取到焦點,
真正要獲取到焦點要通過點選或者程式碼呼叫requestFocus()方法來獲取

第二:selected狀態只能由程式碼中呼叫setSelected(boolean)來設定,不會收到點選或者觸控控制,
即使你自定義觸控事件也依然是要呼叫setSelected(boolean)。

經過測試,我發現第一種獲取焦點的方法並不好用,很多情況下都無法滿足TextView的“虛榮心”,而第二種設定選中的方法卻是沒出現過任何問題,所以在這裡我推薦大家使用第二種方法。當然,第一種方法的實現我也在這裡貼出來:

第一種方法(在xml中設定如下屬性):

    android:focusable="true"//可以獲取到焦點
    android:focusableInTouchMode="true"//可以通過觸控獲取到焦點

第二種方法(在程式碼裡呼叫)(推薦):

    textView.setSelected(true);

另外說下上面的xml中最後幾個屬性=

    //marqueeRepeatMode指的是TextView滾動顯示的次數
    //預設是滾動3次,marquee_forever表示滾動無限次
    android:marqueeRepeatLimit="marquee_forever"
    //maxEms表示的是單行顯示的最大長度,要實現跑馬燈效果必須讓文字內容大於最大長度
    //這裡設定成6則代表最多顯示5箇中文字元
    android:maxEms="5"

關於跑馬燈的實現基本介紹到這裡,總結下,xml中設定為單行顯示,省略模式設定為跑馬燈,讓內容大於最大長度,在程式碼中呼叫setSelected(true)設定為選中狀態,則可實現跑馬燈效果,而滾動次數可以在xml中通過marqueeRepeatLimit屬性來設定

謝謝大家閱讀,本文到這結束,如有地方需要加以改進,還請指出,萬分感謝~