android TextView 垂直自動滾動字幕實現TextSwitcher
實現功能:用TextSwitcher實現文字自動垂直滾動,類似淘寶首頁廣告條。
實現效果:
注意:由於網上橫向滾動的例子比較多,所以這裡通過垂直的例子演示。
實現步驟:1、extends TextSwitcher implements ViewFactory
2、重寫makeView(),在裡面返回一個TextView
3、對TextSwitcher做初始化設定:setFactory、setInAnimation、setOutAnimation
4、給TextSwitcher設定要滾動的文字內容
5、使用Timer進行定時傳送訊息給Handler,handler收到訊息之後,取出下一個要顯示的文字,然後執行內容的切換。
上程式碼:
- package com.example.testtextview;
- import java.util.Timer;
- import java.util.TimerTask;
- import android.content.Context;
- import android.os.Handler;
- import android.os.Message;
- import android.util.AttributeSet;
- import android.view.View;
-
import android.view.animation.AnimationUtils;
- import android.widget.TextSwitcher;
- import android.widget.TextView;
- import android.widget.ViewSwitcher.ViewFactory;
- /**
- * @author (●—●)
- *
- * @data 2015-12-15下午3:36:00
- *
- * @describe
- */
- publicclass TextSwitchView extends TextSwitcher implements ViewFactory{
- privateint index= -1;
-
private
- private Handler mHandler = new Handler(){
- <span style="white-space:pre"> </span>publicvoid handleMessage(Message msg) {
- switch (msg.what) {
- case1:
- index = next(); //取得下標值
- updateText(); //更新TextSwitcherd顯示內容;
- break;
- }
- };
- };
- private String [] resources={
- "靜夜思",
- "床前明月光","疑是地上霜",
- "舉頭望明月",
- "低頭思故鄉"
- };
- private Timer timer; //
- public TextSwitchView(Context context) {
- super(context);
- this.context = context;
- init();
- }
- public TextSwitchView(Context context, AttributeSet attrs) {
- super(context, attrs);
- this.context = context;
- init();
- }
- privatevoid init() {
- if(timer==null)
- timer = new Timer();
- this.setFactory(this);
- this.setInAnimation(AnimationUtils.loadAnimation(context, R.anim.in_animation));
- this.setOutAnimation(AnimationUtils.loadAnimation(context, R.anim.out_animation));
- }
- publicvoid setResources(String[] res){
- this.resources = res;
- }
- publicvoid setTextStillTime(long time){
- if(timer==null){
- timer = new Timer();
- }else{
- timer.scheduleAtFixedRate(new MyTask(), 1, time);//每3秒更新
- }
- }
- privateclass MyTask extends TimerTask{
- @Override
- publicvoid run() {
- mHandler.sendEmptyMessage(1);
- }
- }
- privateint next(){
- int flag = index+1;
- if(flag>resources.length-1){
- flag=flag-resources.length;
- }
- return flag;
- }
- privatevoid updateText(){
- this.setText(resources[index]);
- }
- @Override
- public View makeView() {
- TextView tv =new TextView(context);
- return tv;
- }
- }
- </span></span>
- <?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"
- android:toYDelta="0%p" />
- </set>
out_animation.xml
- <?xml version="1.0" encoding="utf-8"?>
- <set xmlns:android="http://schemas.android.com/apk/res/android" >
- <translate
- android:duration="2000"
- android:fromYDelta="0%p"
- android:toYDelta="-100%p" />
- </set>
主程式呼叫:
- TextSwitchView tsv = (TextSwitchView) findViewById(R.id.tsv);
- String [] res={
- "靜夜思",
- "床前明月光","疑是地上霜",
- "舉頭望明月",
- "低頭思故鄉"
- };
- tsv.setResources(res);
- 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]); 去修改文字內容而已了。文字內容修改完,滾進跟滾出的動畫剛才已經解釋了。收工。