需求:判断是向左滑动还是向右滑动
package com.jiangtea.gesturedemo;
import android.os.Bundle;
import android.support.v4.view.GestureDetectorCompat;
import android.support.v7.app.AppCompatActivity;
import android.util.DisplayMetrics;
import android.util.Log;
import android.view.MotionEvent;
import android.view.GestureDetector.OnGestureListener;
import android.view.GestureDetector.SimpleOnGestureListener;
public class MainActivity extends AppCompatActivity {
protected static final String TAG = "MainActivity";
//private GestureDetector mDetector; //已过时
private GestureDetectorCompat mDetector; //v4包的类,能支持更低的版本
//滑动事件的最小滑动距离
private float FLING_DISTANCE_MIN;
@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);
// 手势监听器 SimpleOnGestureListener
mDetector = new GestureDetectorCompat(this, mListener);
//获取屏幕宽信息
DisplayMetrics metrics = getResources().getDisplayMetrics();
int screenWidth = metrics.widthPixels;//屏幕宽
FLING_DISTANCE_MIN = screenWidth / 4;
//屏幕宽的1/4为滑动最小距离
Log.d(TAG, "FLING_DISTANCE_MIN = " + FLING_DISTANCE_MIN);
//另一种获取屏幕宽高的方法
//getWindowManager().getDefaultDisplay().getWidth();
}
// 监听触摸事件
@Override
public boolean onTouchEvent(MotionEvent event) {
// 手动调用监听器的onTouchEvent
mDetector.onTouchEvent(event);
return super.onTouchEvent(event);
}
// 手势监听器
private OnGestureListener mListener = new SimpleOnGestureListener() {
// 滑动事件,内部自己做了一些判断,滑动距离过小则不会回调
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
// (MotionEvent e1 按下的位置信息, MotionEvent e2 手指抬起的位置信息, floatvelocityX x轴方向上的滑动速度
// x与rawX的区别,x是相对于控件父节点的坐标,rawX是相对于手机屏幕的坐标
float x1 = e1.getRawX();
float y1 = e1.getRawY();
float x2 = e2.getRawX();
float y2 = e2.getRawY();
Log.d(TAG, "onFling(), e1(" + x1 + "," + y1 + "), e2(" + x2 + ","+ y2 + ")");
//计算滑动距离
float offsetX = Math.abs(x2 - x1);
float offsetY = Math.abs(y2 - y1);
if (offsetX < FLING_DISTANCE_MIN) {
Log.w(TAG, "滑动距离太小,不处理!");
return false;
}
if (offsetY > offsetX) {
Log.w(TAG, "滑动倾斜度太大,不处理!");
return false;
}
//判断滑动方向
if (x2 > x1) {
//向右滑动
Log.d(TAG, "向右滑动");
}else{
//向左滑动
Log.d(TAG, "向左滑动");
}
return false;
}
};
}