TextView的跑馬燈效果實現 問題描述 當文字內容過長,但是只允許顯示一行時,可以將文字顯示為跑馬燈效果,即文字滾動顯示。 代碼實現 第一種方法實現 先查詢TextView控制項的屬性,得到以下信息: android:ellipsize=”marquee” TextView採用跑馬燈屬性. and ...
TextView的跑馬燈效果實現
問題描述
當文字內容過長,但是只允許顯示一行時,可以將文字顯示為跑馬燈效果,即文字滾動顯示。
代碼實現
第一種方法實現
先查詢TextView控制項的屬性,得到以下信息:
- android:ellipsize=”marquee”
TextView採用跑馬燈屬性. - android:marqueeRepeatLimit=”marquee_forever”
設置重覆滾動的次數,marquee_forever表示無限次.
在設置了上面兩個屬性之後,還需要設置兩個屬性,使得TextView可以獲得焦點,滾動起來,不獲取焦點,TextView並不會滾動。
- android:focusableInTouchMode=”true”
在Touch模式下可以獲取焦點。 - android:focusable=”true”
TextView可以獲取焦點。
TextView的設置屬性如下:
<TextView
android:id="@+id/tv"
android:layout_width="400dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="marquee"
android:focusableInTouchMode="true"
android:focusable="true"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="Hello World!相當長的內容,只能顯示一行,內容太多,顯示不下,所以採用跑馬燈方式顯示,哈哈哈哈哈。。。"
/>
這種方法實現存在一個問題,就是當其他控制項獲取焦點之後,TextView沒有了焦點,則會停止跑馬燈效果。
在TextView控制項下麵添加一個EditText控制項,當點擊EditText控制項時,EditText控制項將會獲得焦點,TextView將會失去焦點,代碼如下:
<TextView
android:id="@+id/tv"
android:layout_width="400dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="marquee"
android:focusableInTouchMode="true"
android:focusable="true"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:text="Hello World!相當長的內容,只能顯示一行,內容太多,顯示不下,所以採用跑馬燈方式顯示,哈哈哈哈哈。。。" />
<EditText
android:layout_width="match_parent"
android:layout_height="wrap_content"
android:layout_marginTop="10dp"
android:layout_below="@id/tv"
/>
運行代碼之後,點擊EditText,上面的TextView就會停止跑馬燈效果,所以如果佈局上有其他控制項就不適合第一種方式。
第二種方法實現
通過修改TextView的isFocus()方法,使其返回為true,可以一直獲取焦點。代碼如下:
public class FocusTextView extends TextView{
public FocusTextView(Context context) {
super(context);
}
public FocusTextView(Context context, @Nullable AttributeSet attrs) {
super(context, attrs);
}
public FocusTextView(Context context, @Nullable AttributeSet attrs, int defStyleAttr) {
super(context, attrs, defStyleAttr);
}
@Override
public boolean isFocused() {
return true;
}
}
FocusTextView的使用為:
<com.zhangmiao.sixproject.FocusTextView
android:id="@+id/focus_tv"
android:layout_width="400dp"
android:layout_height="wrap_content"
android:layout_centerInParent="true"
android:ellipsize="marquee"
android:gravity="center"
android:marqueeRepeatLimit="marquee_forever"
android:singleLine="true"
android:layout_below="@id/tv"
android:text="Hello World!相當長的內容,只能顯示一行,內容太多,顯示不下,所以採用跑馬燈方式顯示,哈哈哈哈哈。。。"
/>
這種方式就不會有第一種方式的問題。
總結
第一種方式實現方便快捷,但是存在被其他控制項奪取焦點之後效果消失的問題。
第二種方式需要實現一個類去繼承TextView,重寫isFocus()方法,沒有第一種方式的問題。
推薦第二種方式。