1. 程式人生 > >APP實用開發——TextSwitcher實現文字自動垂直滾動

APP實用開發——TextSwitcher實現文字自動垂直滾動

TextSwitcher 字面理解是文字交換器,是ViewSwitcher的子類,從ViewSwitcher來看,是View交換器,TextSwitcher繼承自ViewSwitcher,顯然是交換TextView。

應用分為三步:
1.得到 TextSwitcher 例項物件
TextSwitcher switcher = (TextSwitcher) findViewById(R.id.textSwitcher);
2.為switcher指定ViewSwitcher.ViewFactory工廠,該工廠會產生出轉換時需要的View
switcher.setFactory(this);
3.為switcher設定顯示的內容,該方法執行,就會切換到下個View
switcher.setText(String.valueOf(new Random().nextInt()));

其中 要實現ViewSwitcher.ViewFactory中的makeView()方法
// 重寫 ViewSwitcher.ViewFactory 的 makeView()方法,返回一個 View,TextSwitcher 交換時使用
@Override
public View makeView() {
TextView textView = new TextView(this);
textView.setTextSize(36);
return textView;
}

如果不適用ViewSwitcher.ViewFactory,也可以使用下面的方式代替
//如果不用switcher.setFactory()方法設定轉換時的View,也可以呼叫兩次switcher.addView(view,index,params);
//其中view為要切換的View,index為索引,params是新增時的寬,高參數
// TextView textView1 = new TextView(this);
// textView1.setTextSize(36);
// textView1.setTextColor(Color.RED);
// TextView textView2 = new TextView(this);
// textView2.setTextSize(36);
// textView2.setTextColor(Color.YELLOW);
// switcher.addView(textView1, 0,new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));
// switcher.addView(textView2, 1,new LayoutParams(LayoutParams.WRAP_CONTENT,LayoutParams.WRAP_CONTENT));

實現功能:用TextSwi
tcher實現文字自動垂直滾動,類似淘寶首頁廣告條。
注意:由於網上橫向滾動的例子比較多,所以這裡通過垂直的例子演示。
實現步驟:1、extends TextSwitcher implements ViewFactory
2、重寫makeView(),在裡面返回一個TextView
3、對TextSwitcher做初始化設定:setFactory、setInAnimation、setOutAnimation
4、給TextSwitcher設定要滾動的文字內容
5、使用Timer進行定時傳送訊息給Handler,handler收到訊息之後,取出下一個要顯示的文字,然後執行內容的切換。
上程式碼:

public class TextSwitchView extends TextSwitcher implements ViewFactory{  
    private int index= -1;  
    private Context context;  
    private Handler mHandler = new Handler(){      
public void handleMessage(Message msg) {      
            switch (msg.what) {      
            case 1:      
                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();     
    }  
    private void 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));  
    }  
    public void setResources(String[] res){  
        this.resources = res;  
    }  
    public void setTextStillTime(long time){  
        if(timer==null){  
            timer = new Timer();      
        }else{  
            timer.scheduleAtFixedRate(new MyTask(), 1, time);//每3秒更新    
        }  
    }  
    private class MyTask extends TimerTask{      
        @Override      
        public void run() {      
            mHandler.sendEmptyMessage(1);  
        }         
    }    
    private int next(){    
        int flag = index+1;    
        if(flag>resources.length-1){    
            flag=flag-resources.length;    
        }    
        return flag;    
    }    
    private void updateText(){    
        this.setText(resources[index]);    
    }  
    @Override  
    public View makeView() {  
        TextView tv =new TextView(context);    
        return tv;    
    }  
}  

in_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="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.在佈局檔案使用該自定義控制元件時候,需要修改下全路徑名為你專案該控制元件的全路徑名
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]); 去修改文字內容而已了。文字內容修改完,滾進跟滾出的動畫剛才已經解釋了