需求:在 ViewFlipper 或自定義佈局中,通過左右滑動手勢切換頁面,而非點擊按鈕。本文提供基於 GestureDetector 的完整實現方案。
OnGestureListener。GestureDetector 並代理 onTouchEvent。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; }
}
<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 模式,輕松實現直觀的滑動交互。