2025-02-10

Java代碼 
public class Main extends Activity implements OnGestureListener, 
        OnTouchListener { 
    // 一般不直接使用ViewAnimator而是使用它的兩個子類ViewFlipper和ViewSwitcher。ViewFlipper可以用來指定FrameLayout內多個View之間的切換效果,可以一次指定也可以每次切換的時候都指定單獨的效果。該類額外提供瞭如下幾個函數: 
    // isFlipping: 用來判斷View切換是否正在進行 
    // setFilpInterval:設置View之間切換的時間間隔 
    // startFlipping:使用上面設置的時間間隔來開始切換所有的View,切換會循環進行 
    // stopFlipping: 停止View切換 
    private ViewFlipper viewFlipper; 
    private GestureDetector gestureDetector; 
 
    private Button pre1Button; 
    private Button next1Button; 
 
    @Override 
    public void onCreate(Bundle savedInstanceState) { 
        super.onCreate(savedInstanceState); 
        setContentView(R.layout.main); 
        init(); 
    } 
 
    private void init() { 
        pre1Button = (Button) findViewById(R.id.preButton1); 
        next1Button = (Button) findViewById(R.id.nextButton1); 
        pre1Button.setOnTouchListener(this); 
        next1Button.setOnTouchListener(this); 
        gestureDetector = new GestureDetector(this); 
        viewFlipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper); 
    } 
 
    // GestureDetector.OnDoubleTapListener:用來通知DoubleTap事件,類似於鼠標的雙擊事件,該接口有如下三個回調函數: 
    //    
    // 1. onDoubleTap(MotionEvent e):通知DoubleTap手勢, 
    // 2. onDoubleTapEvent(MotionEvent 
    // e):通知DoubleTap手勢中的事件,包含down、up和move事件(這裡指的是在雙擊之間發生的事件,例如在同一個地方雙擊會產生DoubleTap手勢,而在DoubleTap手勢裡面還會發生down和up事件,這兩個事件由該函數通知); 
    // 3. onSingleTapConfirmed(MotionEvent 
    // e):用來判定該次點擊是SingleTap而不是DoubleTap,如果連續點擊兩次就是DoubleTap手勢,如果隻點擊一次,OPhone系統等待一段時間後沒有收到第二次點擊則判定該次點擊為SingleTap而不是DoubleTap,然後觸發SingleTapConfirmed事件。 
    public boolean onDoubleTap(MotionEvent e) { 
        if (viewFlipper.isFlipping()) { 
            viewFlipper.stopFlipping(); 
        } else { 
            viewFlipper.startFlipping(); 
        } 
        return true; 
    } 
 
    @Override 
    public boolean onTouchEvent(MotionEvent event) { 
        return this.gestureDetector.onTouchEvent(event); 
    } 
 
    @Override 
    public boolean onDown(MotionEvent e) { 
        // down事件 
        return false; 
    } 
 
    public boolean onFling(// 
            MotionEvent e1, // e1:第一個ACTION_DOWN事件(手指按下的那一點) 
            MotionEvent e2, // e2:最後一個ACTION_MOVE事件 (手指松開的那一點) 
            float velocityX,// velocityX:手指在x軸移動的速度 單位:像素/秒 
            float velocityY)// velocityY:手指在y軸移動的速度 單位:像素/秒 
    { 
        // 滑動手勢事件 
        if (e1.getX() – e2.getX() > 60) {// 向右滑動,下一頁 
            // setOutAnimation: 設置View退出屏幕時候使用的動畫,參數setInAnimation函數一樣。 
            this.viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.zoomin)); 
            this.viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.zoomout)); 
            this.viewFlipper.showNext();// 調用該函數來顯示FrameLayout裡面的下一個View。 
            return true; 
        } else if (e1.getX() – e2.getX() < -60) {// 向左滑動,上一頁 
            this.viewFlipper.setInAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.zoomin)); 
            this.viewFlipper.setOutAnimation(AnimationUtils.loadAnimation(this, 
                    R.anim.zoomout)); 
            this.viewFlipper.showPrevious();// 調用該函數來顯示FrameLayout裡面的上一個View。 
            return true; 
        } 
        return false; 
    } 
 
    @Override 
    public void onLongPress(MotionEvent e) { 
        // 長按事件 
    } 
 
    @Override 
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, 
            float distanceY) { 
        // 在屏幕上拖動事件。 
        return false; 
    } 
 
    @Override 
    public void onShowPress(MotionEvent e) { 
        // down事件發生而move或則up還沒發生前觸發該事件; 
    } 
 
    @Override 
    public boolean onSingleTapUp(MotionEvent e) { 
        // 一次點擊up事件; 
        return false; 
    } 
 
    // 按鈕觸摸事件 
    public boolean onTouch(View v, MotionEvent event) { 
        switch (v.getId()) { 
        case R.id.preButton1: 
            if (event.getAction() == MotionEvent.ACTION_DOWN) { // 按鈕按下背景圖片 
                // pre1Button.setBackgroundResource(R.drawable.pre_button1); 
            } 
            // 按鈕up後設置背景圖片,並滑動到前一頁面 
            else if (event.getAction() == MotionEvent.ACTION_UP) { 
                // pre1Button.setBackgroundResource(R.drawable.pre_button); 
                // flipper.setInAnimation(AnimationUtils.loadAnimation(Main.this, 
                // R.anim.push_right_in)); 
                // 
                // flipper.setOutAnimation(AnimationUtils.loadAnimation(Main.this,R.anim.push_right_out)); 
                viewFlipper.showPrevious(); 
            } 
            break; 
        case R.id.nextButton1: 
            if (event.getAction() == MotionEvent.ACTION_DOWN) { 
                // next1Button.setBackgroundResource(R.drawable.next_button1); 
            } 
            // 按鈕up後設置背景圖片,並滑動到後一頁面 
            else if (event.getAction() == MotionEvent.ACTION_UP) { 
                // next1Button.setBackgroundResource(R.drawable.next_button); 
                // flipper.setInAnimation(AnimationUtils.loadAnimation(Main.this, 
                // R.anim.push_left_in)); 
                // 
                // flipper.setOutAnimation(AnimationUtils.loadAnimation(Main.this,R.anim.push_left_out)); 
                viewFlipper.showNext(); 
            } 
            break; 
 
        default: 
            break; 
        } 
        return false; 
    } 

 
Xml代碼 
<?xml version="1.0" encoding="utf-8"?> 
<AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" 
    android:orientation="vertical" android:layout_width="fill_parent" 
    android:layout_height="fill_parent"> 
    <ViewFlipper android:id="@+id/ViewFlipper" 
        android:layout_width="fill_parent" android:layout_height="fill_parent"> 
        <!– 第 1 頁 –> 
        <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" 
            android:orientation="vertical" android:layout_width="fill_parent" 
            android:background="#FFFFFF" android:layout_height="fill_parent"> 
            <TextView android:text="第 1 頁" android:textSize="35dp" 
                android:textColor="#000000" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:layout_x="115dp" 
                android:layout_y="20dp" /> 
        </AbsoluteLayout> 
        <!– 第 2 頁 –> 
        <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" 
            android:orientation="vertical" android:layout_width="fill_parent" 
            android:background="#FFFF00" android:layout_height="fill_parent"> 
            <TextView android:text="第 2 頁" android:textSize="35dp" 
                android:textColor="#000000" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:layout_x="120dp" 
                android:layout_y="20dp" /> 
        </AbsoluteLayout> 
        <!– 第 3 頁 –> 
        <AbsoluteLayout xmlns:android="http://schemas.android.com/apk/res/android" 
            android:orientation="vertical" android:layout_width="fill_parent" 
            android:background="#99CC33" android:layout_height="fill_parent"> 
            <TextView android:text="第 3 頁" android:textSize="35dp" 
                android:textColor="#000000" android:layout_width="wrap_content" 
                android:layout_height="wrap_content" android:layout_x="120dp" 
                android:layout_y="20dp" /> 
        </AbsoluteLayout> 
    </ViewFlipper> 
    <Button android:layout_width="wrap_content" android:text="上一頁" 
        android:gravity="center" android:textSize="20sp" 
        android:layout_height="40dp" android:id="@+id/preButton1" 
        android:layout_x="101dp" android:layout_y="300dp" /> 
    <Button android:layout_width="wrap_content" android:text="下一頁" 
        android:layout_height="40dp" android:id="@+id/nextButton1" 
        android:gravity="center" android:textSize="20sp" android:layout_x="182dp" 
        android:layout_y="300dp" /> 
</AbsoluteLayout> 

作者“AndLi”
 

發佈留言

發佈留言必須填寫的電子郵件地址不會公開。 必填欄位標示為 *