Activity中的滑動監聽事件
阿新 • • 發佈:2019-02-18
import android.app.Activity; import android.os.Bundle; import android.view.GestureDetector; import android.view.MotionEvent; import android.view.View; import android.view.GestureDetector.SimpleOnGestureListener; public abstract class BaseSetupActivity extends Activity { protected static final String TAG = "BaseSetupActivity"; private GestureDetector mDetector; @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); // 建立 mDetector = new GestureDetector(this, new SimpleOnGestureListener() { @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { // e1: 開始的點的資料 // e2: 結束的點的資料 // velocityX: // velocityY: float x1 = e1.getX(); float x2 = e2.getX(); float y1 = e1.getY(); float y2 = e2.getY(); Logger.d(TAG, "velocityX : " + velocityX); // 速率的過濾 if (Math.abs(velocityX) < 80) { return false; } // 如果使用者是垂直方向滑動不做操作 if (Math.abs(y1 - y2) > Math.abs(x1 - x2)) { return false; } // 如果從右往左滑動(x1 > x2),下一步操作 if (x1 > x2) { // 下一步操作 doNext(); } else { // 如果從左往右滑動,上一步操作 doPre(); } return super.onFling(e1, e2, velocityX, velocityY); } }); } @Override public boolean onTouchEvent(MotionEvent event) { mDetector.onTouchEvent(event); return super.onTouchEvent(event); } public void clickPre(View view) { doPre(); } private void doPre() { // 頁面跳轉 (不同點)--->交給具體的子類實現 // Intent intent = new Intent(this, SjfdSetup1Activity.class); // startActivity(intent); if (performPre()) { // 流程中斷 return; } // enterAnim: 進入的activity的動畫 // exitAnim: 退出的activity的動畫 overridePendingTransition(R.anim.pre_enter, R.anim.pre_exit); finish(); } public void clickNext(View view) { doNext(); } private void doNext() { // 頁面跳轉 (不同點)--->交給具體的子類實現 // Intent intent = new Intent(this, SjfdSetup3Activity.class); // startActivity(intent); if (performNext()) { return; } // (共同點) --->父類實現 // 動畫 // enterAnim: 進入的activity的動畫 // exitAnim: 退出的activity的動畫 overridePendingTransition(R.anim.next_enter, R.anim.next_exit); // 銷燬 finish(); } /** * 執行上一步的操作 * * @return 如果返回true 中斷流程 */ protected abstract boolean performPre(); /** * 執行下一步的操作 * * @return 如果返回true 中斷流程 */ protected abstract boolean performNext(); }