android學習---ViewFlipper實現滑動翻頁


ViewFlippe

  1)View切換的控件—ViewFlipper介紹

    ViewFilpper類繼承於ViewAnimator類。而ViewAnimator類繼承於FrameLayout。

    查看ViewAnimator類的源碼可以看出此類的作用主要是為其中的View切換提供動畫效果。該類有如下幾個和動畫相關的方法。

    setInAnimation:設置View進入屏幕時候使用的動畫。該方法有兩個重載方法,即可以直接傳入Animation對象,也可以傳入定義的Animation文件的resourceID。

    setOutAnimation:設置View退出屏幕時候使用的動畫。使用方法和setInAnimation方法一樣。

    showNext:調用該方法可以顯示FrameLayout里面的下一個View。

    showPrevious:調用該方法可以來顯示FrameLayout里面的上一個View。

    查看ViewFlipper的源碼可以看到,ViewFlipper主要用來實現View的自動切換。該類提供了如下幾個主要的方法。

    setFilpInterval:設置View切換的時間間隔。參數為毫秒。

    startFlipping:開始進行View的切換,時間間隔是上述方法設置的間隔數。切換會循環進行。

    stopFlipping:停止View切換。

    setAutoStart:設置是否自動開始。如果設置為“true”,當ViewFlipper顯示的時候View的切換會自動開始。

    一般情況下,我們都會使用ViewFilpper類實現View的切換,而不使用它的父類ViewAnimator類。

 

2)實現滑動—GestureDetector介紹

   如果想要實現滑動翻頁的效果,就要了解另外一個類:android.view.GestureDetector類。GestureDetector類中可以用來檢測各種手勢事件。該類有兩個回調接口,分別用來通知具體的事件。

    GestureDetector.OnDoubleTapListener:用來通知DoubleTap事件,類似於PC上面的鼠標的雙擊事件。

    GestureDetector.OnGestureListener:用來通知普通的手勢事件,該接口有六個回調方法,具體的可以查看API。這里想要實現滑動的判斷,就需要用到其中的onFling()方法。

 

3)具體的實現

下面的代碼片段詳細說明了如何實現滑動翻頁:

工程文件截圖:

 

 

 

 

           

 

 

 

 

 

 

 

 

 

 

 

     

效果圖:                         

  

 

實現代碼:

Main.java

package com.leaf.android;

import android.app.Activity;
import android.os.Bundle;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.GestureDetector.OnGestureListener;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

/**
 * Android實現左右滑動效果
 * 
 * @author leaf
 * 
 */
public class Main extends Activity implements OnGestureListener {
    private ViewFlipper flipper;
    private GestureDetector detector;

    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        detector = new GestureDetector(this);
        flipper = (ViewFlipper) this.findViewById(R.id.ViewFlipper1);

        flipper.addView(addTextView(R.drawable.img1));
        flipper.addView(addTextView(R.drawable.img2));
        flipper.addView(addTextView(R.drawable.img3));
        flipper.addView(addTextView(R.drawable.img4));
        flipper.addView(addTextView(R.drawable.img5));
    }

    private View addTextView(int id) {
        ImageView iv = new ImageView(this);
        iv.setImageResource(id);
        return iv;
    }

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
            float velocityY) {
        if (e1.getX() - e2.getX() > 120) {
            this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
                    R.anim.push_left_in));
            this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
                    R.anim.push_left_out));
            this.flipper.showNext();
            return true;
        } else if (e1.getX() - e2.getX() < -120) {
            this.flipper.setInAnimation(AnimationUtils.loadAnimation(this,
                    R.anim.push_right_in));
            this.flipper.setOutAnimation(AnimationUtils.loadAnimation(this,
                    R.anim.push_right_out));
            this.flipper.showPrevious();
            return true;
        }

        return false;
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // TODO Auto-generated method stub
        return this.detector.onTouchEvent(event);
    }

    public boolean onDown(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

    public void onLongPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX,
            float distanceY) {
        // TODO Auto-generated method stub
        return false;
    }

    public void onShowPress(MotionEvent e) {
        // TODO Auto-generated method stub

    }

    public boolean onSingleTapUp(MotionEvent e) {
        // TODO Auto-generated method stub
        return false;
    }

}

main.xml文件中代碼:

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:orientation="vertical" >

    <ViewFlipper
        android:id="@+id/ViewFlipper1"
        android:layout_width="fill_parent"
        android:layout_height="fill_parent" >
    </ViewFlipper>

</LinearLayout>

 

在res文件夾下新建anim文件夾,並新建四個xml文件,如下:

push_left_in.xml文件中代碼:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="100%p"
        android:toXDelta="0" />

    <alpha
        android:duration="500"
        android:fromAlpha="0.1"
        android:toAlpha="1.0" />

</set>

 

push_left_out.xml文件中代碼:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:toXDelta="-100%p" />

    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:toAlpha="0.1" />

</set>

 

push_right_in.xml文件中代碼:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="-100%p"
        android:toXDelta="0" />

    <alpha
        android:duration="500"
        android:fromAlpha="0.1"
        android:toAlpha="1.0" />

</set>

 

push_right_out.xml文件中代碼:

<?xml version="1.0" encoding="utf-8"?>
<set xmlns:android="http://schemas.android.com/apk/res/android" >

    <translate
        android:duration="500"
        android:fromXDelta="0"
        android:toXDelta="100%p" />

    <alpha
        android:duration="500"
        android:fromAlpha="1.0"
        android:toAlpha="0.1" />

</set>

 

源碼下載

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM