通过 Gesture (手势)实现翻页

手势,就是用户或者触摸笔在触摸屏上连续触碰的行为,使用 android 的手势检测需要如下两个步骤:

(1) 创建一个 GestureDetector 对象,且必须实现一个 GestureDetector.OnGestureListener 监听器实例;

 (2)为应用程序的 Activity 上的 TouchEvent 事件绑定监听器,在事件处理中指定把 Activity 上的 TouchEvent 事件交给 GestureDetector 处理。


效果如下(可以循环翻页):

通过 Gesture (手势)实现翻页_第1张图片


使用 AndroidStudio 1.5 ,其 content_main.xml 如下:




    

    





package com.crazy.gestureflip;

import android.os.Bundle;
import android.support.v7.app.AppCompatActivity;
import android.support.v7.widget.Toolbar;
import android.view.GestureDetector;
import android.view.MotionEvent;
import android.view.View;
import android.view.animation.Animation;
import android.view.animation.AnimationUtils;
import android.widget.ImageView;
import android.widget.ViewFlipper;

public class MainActivity extends AppCompatActivity implements
        GestureDetector.OnGestureListener{

    ViewFlipper flipper;

    GestureDetector detector;
    // 定义一个动画数组,用于为 ViewFlipper 切换动画效果
    Animation[] animations = new Animation[4];
    // 定义手势动作两点之间的最小距离
    final int MIN_DISTANCE = 40;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        Toolbar toolbar = (Toolbar) findViewById(R.id.toolbar);
        setSupportActionBar(toolbar);

        detector = new GestureDetector(this, this);

        flipper = (ViewFlipper)this.findViewById(R.id.flipper);

        flipper.addView(addImageView(R.drawable.header1));
        flipper.addView(addImageView(R.drawable.header2));
        flipper.addView(addImageView(R.drawable.header3));
        flipper.addView(addImageView(R.drawable.header4));
        flipper.addView(addImageView(R.drawable.header5));
        flipper.addView(addImageView(R.drawable.header6));

        animations[0] = AnimationUtils.loadAnimation(this, R.anim.left_in);
        animations[1] = AnimationUtils.loadAnimation(this, R.anim.left_out);
        animations[2] = AnimationUtils.loadAnimation(this, R.anim.right_in);
        animations[3] = AnimationUtils.loadAnimation(this, R.anim.right_out);
    }

    private View addImageView(int resId){
        ImageView imageView = new ImageView(this);
        imageView.setImageResource(resId);
        imageView.setScaleType(ImageView.ScaleType.FIT_CENTER);
        return imageView;
    }

    // 把 Activity 的 TouchEvent 交给 GestureDetector 处理
    @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) {
        // 从右往左滑
        if (e1.getX() - e2.getX() > MIN_DISTANCE){
            // 为 flipper 设置切换的动画效果
            flipper.setInAnimation(animations[0]);
            flipper.setOutAnimation(animations[1]);
            flipper.showNext();
            return true;

            // 从左往右滑
        } else if (e2.getX() - e1.getX() > MIN_DISTANCE){
            flipper.setInAnimation(animations[2]);
            flipper.setOutAnimation(animations[3]);
            flipper.showPrevious();
            return true;
        }

        return false;
    }
}



由于使用了 ViewFlipper 因此可以指定 XML 属性(res 文件夹下的 anim 文件夹中定义):


left_in.xml :

   
   
    

   



left_out.xml :

   
   
    

 


right_in.xml :

   
   
     
              
  


right_out.xml :

   
   
       
            
   


你可能感兴趣的:(通过 Gesture (手势)实现翻页)