首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

Android 手勢滑動切換 View 實現:OnGestureListener + onFling 完整指南

     編輯:程式設計綜合問答

需求:在 ViewFlipper 或自定義佈局中,通過左右滑動手勢切換頁面,而非點擊按鈕。本文提供基於 GestureDetector 的完整實現方案。

核心步驟

  1. Activity 實現 OnGestureListener。
  2. 創建 GestureDetector 並代理 onTouchEvent。
  3. 重寫 onFling 判斷滑動方向與閾值。

完整代碼實現

public class MainActivity extends Activity implements OnGestureListener {
    private GestureDetector gestureDetector;
    private static final int SWIPE_MIN_DISTANCE = 100;
    private static final int SWIPE_THRESHOLD_VELOCITY = 100;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        gestureDetector = new GestureDetector(this, this);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        float distanceX = e2.getX() - e1.getX();
        float absVelocityX = Math.abs(velocityX);

        // 向右滑動(上一頁)
        if (distanceX > SWIPE_MIN_DISTANCE && absVelocityX > SWIPE_THRESHOLD_VELOCITY) {
            viewFlipper.setInAnimation(this, R.anim.slide_in_right);
            viewFlipper.setOutAnimation(this, R.anim.slide_out_right);
            viewFlipper.showPrevious();
            return true;
        }
        // 向左滑動(下一頁)
        else if (-distanceX > SWIPE_MIN_DISTANCE && absVelocityX > SWIPE_THRESHOLD_VELOCITY) {
            viewFlipper.setInAnimation(this, R.anim.slide_in_left);
            viewFlipper.setOutAnimation(this, R.anim.slide_out_left);
            viewFlipper.showNext();
            return true;
        }
        return false;
    }

    // 其他 OnGestureListener 方法返回 false 即可
    @Override public boolean onDown(MotionEvent e) { return true; }
    @Override public void onLongPress(MotionEvent e) {}
    @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float dX, float dY) { return false; }
    @Override public void onShowPress(MotionEvent e) {}
    @Override public boolean onSingleTapUp(MotionEvent e) { return false; }
}

動畫資源示例 (res/anim/slide_in_left.xml)

<set xmlns:android="https://schemas.android.com/apk/res/android">
    <translate android:fromXDelta="100%" android:toXDelta="0%"
        android:duration="300" />
</set>

進階優化建議

  • 使用 ViewPager + FragmentStatePagerAdapter 替代手動手勢,獲得邊緣效果、預加載、無限循環等開箱即用功能。
  • 若堅持自定義,建議將手勢邏輯封裝為 OnSwipeTouchListener 復用。
  • 閾值 SWIPE_MIN_DISTANCE、SWIPE_THRESHOLD_VELOCITY 需根據測試調整,適配不同屏幕密度。

掌握 GestureDetector 模式,輕松實現直觀的滑動交互。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved