Android實現跑馬燈效果及問題解決

今天公司項目讓實現一個跑馬燈的效果,因爲有用戶反映總是忘記還款截至時間,於是就要求做一個單條文字橫向滾動的效果,用於提示用戶。

GitHub上找了幾個跑馬燈的庫,本以爲可以實現自己想要的效果,不過這個庫真心不錯,推薦給大家:

1.sunfusheng/MarqueeView 這是擴展了 ViewFlipper實現的。

2.gongwen/MarqueeViewLibrary 這也是擴展了ViewFlipper控件實現的

這兩個庫雖然文字過長時都可以滾動,但是文字顯示不全,超出部分被省略掉了

下面總結下我實現過程中遇到的坑

1.首先我是在一個小demo裏面對TextView設置下面的屬性就可以實現跑馬燈效果,代碼如下:

<TextView
      android:layout_width="120dp"
      android:layout_height="wrap_content"
      android:layout_gravity="center"
      android:ellipsize="marquee"
      android:singleLine="true"
      android:focusable="true"
      android:marqueeRepeatLimit="marquee_forever"
      android:focusableInTouchMode="true"
      android:scrollHorizontally="true"
      android:text="abcdefghijklmnopqrstuvwxyz.0123456789"
    />

但是我寫到項目裏面並沒有出現滾動效果

最後發現原來焦點被其他控件搶走了

解決的方法我們可以通過自定義TextView來實現:重寫 isFocused(),返回爲ture

public class MarqueeView extends TextView {
    public MarqueeView(Context context) {
        super(context);
    }

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

    public MarqueeView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
        super(context, attrs, defStyleAttr);
    }
    @Override
    public boolean isFocused() {
        return true;
    }
}

2.如果這時,佈局文件中有兩個跑馬燈和一個EditText的話,第一個走馬燈就會停止。

這是因爲EditText獲取了焦點,解決方案,重寫父類的 onFocusChanged 方法即可
我們在自定義的MarqueeView 中重寫onFocusChanged

/*
* 用於EditText搶注焦點的問題
* */
@Override
protected void onFocusChanged(boolean focused, int direction, Rect previouslyFocusedRect) {
    if (focused) {
        super.onFocusChanged(focused, direction, previouslyFocusedRect);
    }
}

3.如果我們彈出一個對話框的話,會發現,彈出對話框後,跑馬燈效果就停止了,原因是Dialog搶了焦點,解決方案就是重寫下onWindowFocusChanged方案 

/*
* Window與Window間焦點發生改變時的回調
* */
@Override
public void onWindowFocusChanged(boolean hasWindowFocus) {
    if (hasWindowFocus)
        super.onWindowFocusChanged(hasWindowFocus);
}

至此,我們的Android跑馬燈效果已經可以完美的運行了。

不過唯一不足的是,文字過短不會有滾動效果

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章