天天看點

Android手勢識别GestureDetector類

Android為手勢提供了一個GestureDetector類

要想實作手勢的監聽需要實作以下兩個步驟

1、建立GestureDetector對象 實作GestureDetector.OnGestureListener監聽執行個體

2、//2.為activity的onTouchEvent綁定監聽事件

以下是該類實作的demo

ImageSwither.java

package lzl.edu.com.gesturedetectordemo;

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

public class ImageSwither extends Activity implements GestureDetector.OnGestureListener{

    /**
     * 圖檔的切換效果。
     * 步驟:
     * 1、找到幾張好看的圖檔,複制到mipmap中。
     * 2、運用viewFlipper元件(這個第一次聽說過,汗)。該元件是個容器元件。可以添加任意的其他元件
     * 3、使用Animation數組為圖檔設定不同的動畫效果。
     * 4、建立GestureDetector對象,在onTouchEvent中注冊監聽事件
     * 5、 定義滑動坐标的最小距離
     * @param savedInstanceState
     */
    private Animation []animations = new Animation[4];  //設定動畫效果的類
    private ViewFlipper mViewFlipper;
    private GestureDetector detector;
    private final float MIN_DRIC = 50;   //定義滑動坐标的最小距離
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        setContentView(R.layout.activity_image_swither);

        detector = new GestureDetector(this);
        mViewFlipper =(ViewFlipper)findViewById(R.id.viewFlipper);
       int [] images = new int[]{R.mipmap.girl1,R.mipmap.girl2,R.mipmap.girl3,
               R.mipmap.girl4,R.mipmap.girl5};
        for (int i=0;i<images.length;i++) {
            mViewFlipper.addView(addImageView(images[i]));
        }
        //設定圖檔淡進淡出的效果
        animations[0] = AnimationUtils.loadAnimation(this,R.anim.fade_in);
        animations[1] = AnimationUtils.loadAnimation(this,R.anim.fade_out);
    }
    //設定ImageView的布局
    public ImageView addImageView(int id){
        ImageView images = new ImageView(this);
        images.setImageResource(id);
        images.setScaleType(ImageView.ScaleType.FIT_CENTER);  //設定布局
        return images;
    }
    //在onTouchEvent中為GestureDetectors注冊監聽事件
    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return detector.onTouchEvent(event);
    }

    @Override
    public boolean onDown(MotionEvent e) {
        return false;
    }

    @Override
    public void onShowPress(MotionEvent e) {

    }

    @Override
    public boolean onSingleTapUp(MotionEvent e) {
        return false;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        return false;
    }

    @Override
    public void onLongPress(MotionEvent e) {

    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        //進行手勢的監聽,如果e1.getX() - e2.getX()說明是從右往左滑。設定檢視上一張圖檔
        if(e1.getX() - e2.getX() > MIN_DRIC){
            //設定淡出淡入的效果
            mViewFlipper.setInAnimation(animations[0]);
            mViewFlipper.setOutAnimation(animations[1]);
            mViewFlipper.showPrevious();  //顯示先前的圖檔
            return true;
        }
        //進行手勢的監聽,如果e2.getX() - e1.getX()說明是從右往左滑。設定檢視上一張圖檔
        if(e2.getX() - e1.getX() > MIN_DRIC){
            //設定淡出淡入的效果
            mViewFlipper.setInAnimation(animations[0]);
            mViewFlipper.setOutAnimation(animations[1]);
            mViewFlipper.showNext();  //顯示下一張的圖檔
            return true;
        }
        return false;
    }
}
           

activity_image_swither.xml

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
xmlns:tools="http://schemas.android.com/tools" android:layout_width="match_parent"
android:layout_height="match_parent" android:paddingLeft="@dimen/activity_horizontal_margin"
android:paddingRight="@dimen/activity_horizontal_margin"
android:paddingTop="@dimen/activity_vertical_margin"
android:paddingBottom="@dimen/activity_vertical_margin"
tools:context="lzl.edu.com.gesturedetectordemo.ImageSwither">

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

</RelativeLayout>