1. 程式人生 > >android TextView 垂直自動滾動字幕實現TextSwitcher

android TextView 垂直自動滾動字幕實現TextSwitcher

實現功能:用TextSwitcher實現文字自動垂直滾動,類似淘寶首頁廣告條。

實現效果:

注意:由於網上橫向滾動的例子比較多,所以這裡通過垂直的例子演示。

實現步驟:1、extends TextSwitcher implements ViewFactory

2、重寫makeView(),在裡面返回一個TextView

3、對TextSwitcher做初始化設定:setFactory、setInAnimation、setOutAnimation

4、給TextSwitcher設定要滾動的文字內容

5、使用Timer進行定時傳送訊息給Handler,handler收到訊息之後,取出下一個要顯示的文字,然後執行內容的切換。

上程式碼:

  1. package com.example.testtextview;  
  2. import java.util.Timer;  
  3. import java.util.TimerTask;  
  4. import android.content.Context;  
  5. import android.os.Handler;  
  6. import android.os.Message;  
  7. import android.util.AttributeSet;  
  8. import android.view.View;  
  9. import android.view.animation.AnimationUtils;  
  10. import android.widget.TextSwitcher;  
  11. import android.widget.TextView;  
  12. import android.widget.ViewSwitcher.ViewFactory;  
  13. /** 
  14.  * @author (●—●) 
  15.  * 
  16.  * @data 2015-12-15下午3:36:00 
  17.  * 
  18.  * @describe  
  19.  */
  20. publicclass TextSwitchView extends TextSwitcher implements ViewFactory{  
  21.     privateint index= -1;  
  22.     private
     Context context;  
  23.     private Handler mHandler = new Handler(){      
  24. <span style="white-space:pre">    </span>publicvoid handleMessage(Message msg) {      
  25.             switch (msg.what) {      
  26.             case1:      
  27.                 index = next(); //取得下標值  
  28.                 updateText();  //更新TextSwitcherd顯示內容;  
  29.                 break;      
  30.             }      
  31.         };      
  32.     };   
  33.     private String [] resources={    
  34.             "靜夜思",  
  35.             "床前明月光","疑是地上霜",    
  36.             "舉頭望明月",    
  37.             "低頭思故鄉"
  38.     };  
  39.     private Timer timer; //
  40.     public TextSwitchView(Context context) {  
  41.         super(context);  
  42.         this.context = context;  
  43.         init();   
  44.     }  
  45.     public TextSwitchView(Context context, AttributeSet attrs) {  
  46.         super(context, attrs);  
  47.         this.context = context;  
  48.         init();     
  49.     }  
  50.     privatevoid init() {  
  51.         if(timer==null)  
  52.             timer = new Timer();      
  53.         this.setFactory(this);    
  54.         this.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in_animation));    
  55.         this.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out_animation));  
  56.     }  
  57.     publicvoid setResources(String[] res){  
  58.         this.resources = res;  
  59.     }  
  60.     publicvoid setTextStillTime(long time){  
  61.         if(timer==null){  
  62.             timer = new Timer();      
  63.         }else{  
  64.             timer.scheduleAtFixedRate(new MyTask(), 1, time);//每3秒更新  
  65.         }  
  66.     }  
  67.     privateclass MyTask extends TimerTask{      
  68.         @Override
  69.         publicvoid run() {      
  70.             mHandler.sendEmptyMessage(1);  
  71.         }         
  72.     }    
  73.     privateint next(){    
  74.         int flag = index+1;    
  75.         if(flag>resources.length-1){    
  76.             flag=flag-resources.length;    
  77.         }    
  78.         return flag;    
  79.     }    
  80.     privatevoid updateText(){    
  81.         this.setText(resources[index]);    
  82.     }  
  83.     @Override
  84.     public View makeView() {  
  85.         TextView tv =new TextView(context);    
  86.         return tv;    
  87.     }  
  88. }  
  89. </span></span>  
in_animation.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <translate  
  4.         android:duration="2000"
  5.         android:fromYDelta="100%p"
  6.         android:toYDelta="0%p" />  
  7. </set>  

out_animation.xml
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <set xmlns:android="http://schemas.android.com/apk/res/android" >  
  3.     <translate  
  4.         android:duration="2000"
  5.         android:fromYDelta="0%p"
  6.         android:toYDelta="-100%p" />  
  7. </set>  

主程式呼叫:
  1. TextSwitchView tsv = (TextSwitchView) findViewById(R.id.tsv);  
  2. String [] res={    
  3.             "靜夜思",  
  4.             "床前明月光","疑是地上霜",    
  5.             "舉頭望明月",    
  6.             "低頭思故鄉"
  7. };  
  8. tsv.setResources(res);  
  9. tsv.setTextStillTime(5000);  
注意事項:

1.在佈局檔案使用該自定義控制元件時候,需要修改下全路徑名為你專案該控制元件的全路徑名,這裡我是

<com.example.testtextview.TextSwitchView/>

2.使用時候直接先呼叫setResources設定內容,再呼叫setTextStillTime設定文字停留時間,並自動啟動。

3.如需修改內容,只要直接呼叫setResources就好,不要重複呼叫setTextStillTime

程式碼解析:

1、ViewFactory:,是一個檢視工廠。它需要實現makeView()去返回你要的一個檢視,這裡是實現文字滾動,所以直接返回一個TextView,這裡順帶修改TextView的一些屬性,比如文字大小等。

2、setFactory:看下原始碼的解釋:Sets the factory used to create the two views between which the ViewSwitcher will flip.

實際上它幫我們建立了兩個view,然後通過ViewSwitcher幫我們實現了翻轉。

3、重點來了,剛剛提到ViewSwitcher其實只是幫我們實現檢視的切換,然而,檢視的切換的形式動畫,是可以由你自己來定的。

this.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in_animation));  //檢視進來時候的動畫

this.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out_animation));//檢視出去時候的動畫

如果你不想垂直滾動,想實現水平滾動,這裡直接修改動畫就可以了。

4、動畫分析:

<?xml version="1.0" encoding="utf-8"?>

<set xmlns:Android="http://schemas.android.com/apk/res/android" >

    <translate

        android:duration="2000"//動畫的持續時間,如果覺得文字滾動過程太慢,可以修改這裡的時間

        android:fromYDelta="100%p"//Y位置的起點,這裡要先清楚一點,文字顯示在正中間的時候是0%p,由於android的座標系中,y軸往下為正。所以文字進來的時候,其實是從100%p->0%p

        android:toYDelta="0%p" />

</set>

另一個動畫就不解釋了,原理一樣,從0%p->-100%p,自然它就出去了

5、剩下就是通過Timer去呼叫Handler,然後執行this.setText(resources[index]);  去修改文字內容而已了。文字內容修改完,滾進跟滾出的動畫剛才已經解釋了。收工。