天天看點

【Android】TextView的跑馬燈效果說明實作跑馬燈不能啟動的問題擴充最後

老規矩,先上圖看效果。

【Android】TextView的跑馬燈效果說明實作跑馬燈不能啟動的問題擴充最後

2.gif

說明

TextView的跑馬燈效果也就是指當你隻想讓TextView單行顯示,可是文本内容卻又超過一行時,自動從左往右慢慢滑動顯示的效果就叫跑馬燈效果。

其實,TextView實作跑馬燈效果很簡單,因為官方已經實作了,你隻需要通過設定幾個屬性即可。而且,相關的資料其實網上也有一大堆了,之是以還寫這篇部落格出來是因為,網上好多人的部落格都是隻貼代碼的啊,好一點的就是附帶幾張圖檔,可是這是動畫效果啊,不動起來,誰知道跑馬燈效果到底長什麼樣,到底是不是自己想要的效果啊(不會隻有題主不知道跑馬燈是什麼效果吧,我不信!!!)。

是以,輕度強迫症的題主實在忍不住了,自己寫一篇記錄一下。另外,最近在學習豎直方向循環滾動顯示的TextView,等了解掌握透了後也會記錄下來。好了,話不多說,看代碼。

實作

android:ellipsize="marquee" //設定超出顯示區域的内容以跑馬燈效果呈現,該值還可以設定成END, START等,就是我們常見的在末尾"..."顯示。

**android:singleLine="true" ** //跑馬燈啟動的條件之一,另外官方推薦說該方法已廢棄推薦使用maxLines="1", 不用去鳥他,用maxLines的話跑馬燈效果也不會啟動。

android:focusable="true" //跑馬燈啟動的條件之一

android:marqueeRepeatLimit="-1" //設定循環幾次,-1表示無限循環

【Android】TextView的跑馬燈效果說明實作跑馬燈不能啟動的問題擴充最後

1.png

跑馬燈不能啟動的問題

如果對TextView的跑馬燈不熟悉的話,第一次使用應該會碰到各種跑馬燈效果不工作的狀态。其實這是因為跑馬燈的啟動有多個條件,也就是上面的屬性除了最後一條設定循環次數的除外,其他的均必須進行設定。TextView得是單行顯示,還必須可以擷取焦點,這樣當TextView擷取焦點後跑馬燈效果才會啟動,如最上面動圖裡的第二個TextView。

看下TextView關于跑馬燈啟動的相關源碼你就會更清楚

【Android】TextView的跑馬燈效果說明實作跑馬燈不能啟動的問題擴充最後

2.png

至于為什麼用maxLines="1"替代singleLine="true"時, 跑馬燈不會正常工作的原因,我在下一篇部落格裡有解析,感興趣的可以看看。

擴充

其實,跑馬燈更常見于TV應用上,因為隻有在TV應用上才需要區分擷取焦點時的狀态以及點選的狀态,畢竟TV應用都不支援觸屏模式,都是有遙控操作,焦點狀态的提示就顯得很重要。

而對于觸屏手機來說,當觸摸時,也就同時擷取點選狀态和焦點狀态了,是以在觸屏手機上,跑馬燈更常見的應用場景則是,不管TextView有沒有擷取焦點,都讓跑馬燈效果一直處于啟動狀态,正如最上面動圖裡的第一個TextView。如果要實作這個效果,隻需要繼承TextView,重寫幾個方法就好了。代碼如下:

/**
 * 跑馬燈效果的TextView, 使用方式:
 * 啟動/關閉:{@link #setMarqueeEnable(boolean)}
 * xml檔案中記得設定:android:focusable="true", android:singleLine="true"
 *
 * Created by dasu on 2017/3/21.
 * http://www.jianshu.com/u/bb52a2918096
 */

public class MarqueeTextView extends TextView {

    private boolean isMarqueeEnable = false;

    public MarqueeTextView(Context context) {
        super(context);
    }

    public MarqueeTextView(Context context, @Nullable AttributeSet attrs) {
        super(context, attrs);
    }

    public MarqueeTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }

    public void setMarqueeEnable(boolean enable) {
        if (isMarqueeEnable != enable) {
            isMarqueeEnable = enable;
            if (enable) {
                setEllipsize(TextUtils.TruncateAt.MARQUEE);
            } else {
                setEllipsize(TextUtils.TruncateAt.END);
            }
            onWindowFocusChanged(enable);
        }
    }

    public boolean isMarqueeEnable() {
        return isMarqueeEnable;
    }

    @Override
    public boolean isFocused() {
        return isMarqueeEnable;
    }

    @Override
    protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
        super.onFocusChanged(isMarqueeEnable, direction, previouslyFocusedRect);
    }

    @Override
    public void onWindowFocusChanged(boolean hasWindowFocus) {
        super.onWindowFocusChanged(isMarqueeEnable);
    }
}           

複制

最後

以上就是使用TextView跑馬燈的記錄,那麼,如果不用官方提供的有沒有辦法實作呢,答案肯定是有的,怎麼做呢,不知道,最近正好沒事,自己試試看去。