在 Activity 判斷滑動手勢主要是透過 View.OnTouchListener 和 GestureDetector.OnGestureListener  
      透過讓 Activity 繼承 GestureDetector.OnGestureListener 並實作其中的 onFling 方法,在 onFling 方法中判斷第1個按下點的 X 座標和第2個按下點的 X 座標是否超過標準值來決定是否為滑動手勢。      
  經過測試即使是嵌入在 Activity 的 ListView 也可以成功偵測滑動手勢。    
import android.support.constraint.ConstraintLayout;  
  import android.support.v7.app.AppCompatActivity;  
  import android.os.Bundle;  
  import android.util.Log;  
  import android.view.GestureDetector;  
  import android.view.MotionEvent;  
  import android.view.View;  
    
  public class FlingGestureExampleMainActivity extends AppCompatActivity implements View.OnTouchListener,  
      GestureDetector.OnGestureListener{  
    
    private static final String TAG = FlingGestureExampleMainActivity.class.getSimpleName();  
    
    //main ui  
    private ConstraintLayout mBasicLayout;  
    private GestureDetector mGesetureDetector;  
    
    @Override  
    protected void onCreate(Bundle savedInstanceState) {  
      super.onCreate(savedInstanceState);  
      setContentView(R.layout.fling_gesture_example_main_activity);  
    
      mBasicLayout = findViewById(R.id.basic_layout_activity);  
      mBasicLayout.setOnTouchListener(this);  
      mBasicLayout.setLongClickable(true);            
      mGesetureDetector = new GestureDetector((GestureDetector.OnGestureListener) this);  
    }  
    
    @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 firstMotion, MotionEvent secondMotion, float velocityX, float velocityY) {  
      final int FLING_MIN_DISTANCE = 100;  
      final int FLING_MIN_VELOCITY = 200;  
    
      boolean isFlingToLeft = firstMotion.getX() - secondMotion.getX() > FLING_MIN_DISTANCE && Math.abs(velocityX) > FLING_MIN_VELOCITY;  
      if (isFlingToLeft) {  
        Log.d(TAG, "to left");  
      }  
      boolean isFlingToRight = firstMotion.getX() - secondMotion.getX() < FLING_MIN_DISTANCE && Math.abs(velocityX) < FLING_MIN_VELOCITY;  
      if (isFlingToRight) {  
        Log.d(TAG, "to right");  
      }  
      return false;  
    }  
    
    @Override  
    public boolean onTouch(View view, MotionEvent motionEvent) {  
      return mGesetureDetector.onTouchEvent(motionEvent);  
    }  
  }
    主要的重點為讓 Activity實作 onDown, onShowPress, on SingleTapUp, onScroll, onLongPress, onFling, onTouch 方法,  
  並在 onFling 方法判斷滑動的邏輯。  
  以及第23~26行的手勢和 layout 物件的連結      
  layout檔(fling_gesture_example_main_activity.xml)    
<?xml version="1.0" encoding="utf-8"?>  
  <android.support.constraint.ConstraintLayout  
    xmlns:android="http://schemas.android.com/apk/res/android"  
    xmlns:app="http://schemas.android.com/apk/res-auto"  
    xmlns:tools="http://schemas.android.com/tools"  
    android:layout_width="match_parent"  
    android:layout_height="match_parent"  
    android:id="@+id/basic_layout_activity"  
    tools:context=".FlingGestureExampleMainActivity">  
    
    <ListView  
      android:layout_width="wrap_content"  
      android:layout_height="wrap_content"  
      .../>  
    
  </android.support.constraint.ConstraintLayout>
    重點為 ConstraintLayout 建立 id,以便在程式碼中參考。      
  以上便是讓 Activity 加入滑動手勢的判斷,若是想讓該 Activity中  
  的 ListView 也可偵測滑動,作法相當簡單,直接讓該 ListView 呼叫 setOnTouchListener 和 setLongClickable 即可。    
        mPatrolPointListView = getListView();  
          mPatrolPointListViewAdapter =  
                  new PatrolPointListViewAdapter(this, mPatrolPointListPresenter.getPatrolPointItemLayout(firstPage));  
          setListAdapter(mPatrolPointListViewAdapter);  
          ...  
    
          mPatrolPointListView.setOnTouchListener(this);  
          mPatrolPointListView.setLongClickable(true);           
  
     
 Orignal From: 
在Activity中判斷滑動手勢