顧名思義,Switcher是“切換者”的意思,那么TextSwitcher就是文本切換器,ImageSwitcher就是圖片切換器,在某些需要頻繁切換文本或圖片的場景可以考慮使用這兩個類,同時可以在切換過程中加上動畫效果,使界面更為美觀。其繼承結構如下:
public class
ViewSwitcher
extends ViewAnimator
java.lang.Object
? android.view.View
? android.view.ViewGroup
? android.widget.FrameLayout
? android.widget.ViewAnimator
? android.widget.ViewSwitcher
Known Direct Subclasses
ImageSwitcher, TextSwitcher
可以看出ImageSwitcher和TextSwitcher同屬于ViewSwitcher的子類,下面通過一個有趣的倒計時實例學習一下TextSwitcher的用法。 主布局文件(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<TextSwitcher
android:id="@+id/textSwitcher"
android:layout_width="100dp"
android:layout_height="100dp"
android:layout_centerInParent="true" />
</RelativeLayout>
TextSwitcher控件由標簽TextSwitcher標簽包裹,整個布局采用相對布局,設置TextSwitcher屬性layout_centerInParent屬性為true,居中顯示控件。
動畫文件(textswitcher_in.xml)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >
<scale
android:interpolator="@android:anim/accelerate_interpolator"
android:duration="200"
android:pivotX="50%"
android:pivotY="50%"
android:fromXScale="0"
android:fromYScale="0"
android:toXScale="1"
android:toYScale="1"/>
<rotate android:fromDegrees="0"
android:toDegrees="360"
android:duration="500"
android:pivotX="0.5"
android:pivotY="0.5"/>
</set>
設置了scale大小動畫(scale大小設置從0到1)和rotate(0-360度)旋轉動畫。
動畫文件(textswitcher_out.xml)
<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android">
<scale
android:duration="500"
android:fromXScale="1"
android:fromYScale="1"
android:interpolator="@android:anim/accelerate_interpolator"
android:pivotX="50%"
android:pivotY="50%"
android:toXScale="0"
android:toYScale="0" />
<rotate
android:duration="500"
android:fromDegrees="0"
android:pivotX="50%"
android:pivotY="50%"
android:toDegrees="360" />
</set>
MainActivity.java代碼(MainActivity.java)
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
timeCount=new TimeCount(10*1000,1000);//初始化倒計時類
textSwitcher=(TextSwitcher)findViewById(R.id.textSwitcher);
textSwitcher.setInAnimation(AnimationUtils.loadAnimation(this, R.anim.textswitcher_in));//載入動畫
textSwitcher.setOutAnimation(AnimationUtils.loadAnimation(this, R.anim.textswitcher_out));//載入動畫
timeCount.start();//倒計時類開始
textSwitcher.setFactory(new ViewSwitcher.ViewFactory() {
@Override
public View makeView() {
TextView textView = new TextView(MainActivity.this);
textView.setTextColor(Color.RED);//設置字體顏色
textView.setTextSize(40);//設置字體大小
textView.setLayoutParams(new TextSwitcher.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));//設置寬高屬性
return textView;
}
});
}
class TimeCount extends CountDownTimer{//倒計時類
public TimeCount(long millisInFuture, long countDownInterval) {//必須重載的構造方法
super(millisInFuture, countDownInterval);
}
@Override
public void onTick(long millisUntilFinished) {//計時過程中觸發(fā)
count=(int)millisUntilFinished/1000;
textSwitcher.setText(count+"");
}
@Override
public void onFinish() {//計時結束時觸發(fā)
textSwitcher.setText("Dead");
}
}
}
看過上一節(jié)的讀者應該對CountDownTimer類不陌生,這是一個倒計時類,它是一個抽象類,這里通過TimeCount類繼承它,并覆寫了它的兩個方法onTick(倒計時過程中觸發(fā))和onFinish(倒計時結束時觸發(fā)),同時重載了其構造方法,包含兩個參數,一個是millisInFuture表示倒計時時長,單位為毫秒;另一個countDownInterval表示倒計時間隔,單位也為毫秒。
TextSwitcher必須實現ViewSwitcher.ViewFactory接口,并覆寫其中的makeView方法。調用setFactory方法為TextSwitcher設置轉換工廠。
運行實例如下:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/6-1.png" alt="這里寫圖片描述" />
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/6-2.png" alt="這里寫圖片描述" />
倒計時是旋轉著并從小到大顯示,倒計時結束后顯示“Dead”。 上面介紹了ImageSwitcher如何進行文字切換的,下面來研究一下ImageSwitcher的用法。
主布局文件代碼(activity_main.xml)
<?xml version="1.0" encoding="utf-8"?>
<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
android:layout_width="match_parent"
android:layout_height="match_parent">
<ImageSwitcher
android:id="@+id/imageSwitcher"
android:layout_width="match_parent"
android:layout_height="match_parent"/>
</RelativeLayout>
圖片切換器用ImageSwitcher標簽包裹。 MainActivity代碼(MainActivity.java)
public class MainActivity extends Activity {
private ImageSwitcher imageSwitcher;
private int pics[]={R.drawable.pic1,R.drawable.pic2,R.drawable.pic3};//圖片源
private int index=0;//圖片標識位
float startX=0;//手指按下時的x坐標
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
requestWindowFeature(Window.FEATURE_NO_TITLE);
setContentView(R.layout.activity_main);
imageSwitcher=(ImageSwitcher)findViewById(R.id.imageSwitcher);
imageSwitcher.setFactory(new ViewSwitcher.ViewFactory() {//設置轉換工廠
@Override
public View makeView() {
ImageView imageView = new ImageView(MainActivity.this);
imageView.setScaleType(ImageView.ScaleType.FIT_XY);
imageView.setLayoutParams(new ImageSwitcher.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT,
ViewGroup.LayoutParams.MATCH_PARENT));//設置寬高
return imageView;
}
});
imageSwitcher.setImageResource(pics[0]);
}
@Override
public boolean onTouchEvent(MotionEvent event) {//覆寫此方法用于判斷左劃右劃
switch (event.getAction()){
case MotionEvent.ACTION_DOWN:
startX=event.getX();//手指按下時的x坐標作為起始坐標
break;
case MotionEvent.ACTION_UP:
float endX=event.getX();//手指離開時的x坐標作為結束坐標
if( endX-startX>100){//上一頁
if(index>0) {
index--;}else {
index=2;
}
imageSwitcher.setImageResource(pics[index%3]);
imageSwitcher.setInAnimation(MainActivity.this, android.R.anim.fade_in);//設置動畫
imageSwitcher.setOutAnimation(MainActivity.this, android.R.anim.fade_out);//設置動畫
}else if(startX-endX>100){//下一頁
index++;
imageSwitcher.setInAnimation(MainActivity.this, android.R.anim.fade_in);//設置動畫
imageSwitcher.setOutAnimation(MainActivity.this,android.R.anim.fade_out);//設置動畫
imageSwitcher.setImageResource(pics[index % 3]);
}
break;
}
return true;
}
}
可以看出ImageSwitcher同樣也需要設置圖片轉換工廠,在圖片切換操作上覆寫了onTouchEvent方法,根據傳入的event參數調取getAction方法可以得到三個常量:
在手指按下時記錄按下時的X軸坐標,抬起時記錄結束的X軸坐標,根據兩次坐標差值可以得出手指的滑動方向,然后進行圖片的切換。注意圖片切換時index圖片下標的邏輯處理問題。
同時這里用到了ImageSwitcher的setInAnimation方法,引入了系統(tǒng)內置的淡入淡出動畫效果。
運行實例:
http://wiki.jikexueyuan.com/project/twenty-four-Scriptures/images/6-3.png" alt="這里寫圖片描述" />
左右滑動切換圖片,可以看出圖片具有的淡入淡出效果。