1. 程式人生 > >Android textview和listview實現水平自動滾動的走馬燈效果

Android textview和listview實現水平自動滾動的走馬燈效果

當我們遇到需要在一個textview裡顯示較長文字時候,往往有以下幾種考慮:

          1.換行,Android裡本身也是這樣在考慮;

          2.可以進行水平或者垂直滑動;

          3.採用走馬燈效果。

          其實這三種要實現都不難,根據實際情況進行選擇就是了。不過我在具體實現走馬燈時候遇到了一些問題,後來參考了下大神的程式碼,得以解決,記錄一下。

          程式碼地址是:http://download.csdn.net/download/wds1181977/5997065

          具體情況如下:

          textview裡要實現走馬燈效果,主要需要三點:

          設定單行顯示;設定文字超出textview後的效果;以及最重要的是設定焦點。

          對應程式碼如下:

<TextView
android:id="@+id/tv_title"
android:layout_width="100dp"
android:layout_height="match_parent"
android:text="基本資訊"
android:textColor="@color/black"
android:gravity="center_vertical"
android:scrollHorizontally="true"
android
:focusable="true" android:focusableInTouchMode="true" android:singleLine="true" android:ellipsize="marquee" android:marqueeRepeatLimit="marquee_forever" />

         focusable和fucosableInTouchMode是配套用來設定獲取焦點的;singleLine是設定單行;ellipsize是設定文字過長的效果,其中marquee是走馬燈的效果,marqueeRepeatLimit是自動滾動顯示多少次,marquee_forver是一直滾動。

         這樣寫好了以後,但實際我執行的時候並沒有出現走馬燈的效果,而是顯示了最前面部分,然後就是,,,省略掉後面內容了。

         找了一下原因,就是在這個獲取焦點上。

         一般情況我們的佈局都比demo複雜,靜態的設定focusable=true甚至動態的在程式碼用textview.setfocusable裡設定並不能保證焦點就是在這個textview上。

         所以更好的辦法是寫一個自定義的textview,將焦點寫死。比如:

public class MTextView  extends TextView {

    public MTextView(Context context) {
        super(context);
// TODO Auto-generated constructor stub
}

    public MTextView(Context context, AttributeSet attrs) {
        super(context, attrs);
// TODO Auto-generated constructor stub
}

    @Override
public boolean isFocused() {
        // TODO Auto-generated method stub
return true;
}

}
        然後在程式碼裡 引用:
<com.diit.apppro.presentation.view.component.common.MTextView
android:id="@+id/tv_title"
android:layout_width="100dp"
android:layout_height="match_parent"
android:text="基本資訊"
android:textColor="@color/black"
android:gravity="center_vertical"
android:scrollHorizontally="true"
android:singleLine="true"
android:ellipsize="marquee"
android:marqueeRepeatLimit="marquee_forever"  />
         這樣就可以實現了。

         如果是listview的話,只需要在每個item裡的textview引用這個自定義view即可實現各自的走馬燈效果。