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即可實現各自的走馬燈效果。