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]); 去修改文字內容而已了。文字內容修改完,滾進跟滾出的動畫剛才已經解釋了