今天公司項目讓實現一個跑馬燈的效果,因爲有用戶反映總是忘記還款截至時間,於是就要求做一個單條文字橫向滾動的效果,用於提示用戶。
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跑馬燈效果已經可以完美的運行了。
不過唯一不足的是,文字過短不會有滾動效果