【问题标题】:Swipe in android扫一扫安卓
【发布时间】:2011-08-04 06:42:08
【问题描述】:

大家好,大家正在做一个安卓项目来实现滑动功能。 如何做到这一点。

我正在尝试使用 onfling 方法,但它对我不起作用..任何人有正确的解决方案请回复此帖子。

我的在线代码是

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
    if (mGesturesEnabled) {
        try {
            if (e2.getY() - e1.getY() > StudyOptions.sSwipeMinDistance && Math.abs(velocityY) > StudyOptions.sSwipeThresholdVelocity && Math.abs(e1.getX() - e2.getX()) < StudyOptions.sSwipeMaxOffPath && !mIsYScrolling) {
                // down
                executeCommand(mGestureSwipeDown);
            } else if (e1.getY() - e2.getY() > StudyOptions.sSwipeMinDistance && Math.abs(velocityY) > StudyOptions.sSwipeThresholdVelocity && Math.abs(e1.getX() - e2.getX()) < StudyOptions.sSwipeMaxOffPath && !mIsYScrolling) {
                // up
                executeCommand(mGestureSwipeUp);
            } else if (e2.getX() - e1.getX() > StudyOptions.sSwipeMinDistance && Math.abs(velocityX) > StudyOptions.sSwipeThresholdVelocity && Math.abs(e1.getY() - e2.getY()) < StudyOptions.sSwipeMaxOffPath && !mIsXScrolling && !mIsSelecting) {
                // right
                executeCommand(mGestureSwipeRight);
            } else if (e1.getX() - e2.getX() > StudyOptions.sSwipeMinDistance && Math.abs(velocityX) > StudyOptions.sSwipeThresholdVelocity && Math.abs(e1.getY() - e2.getY()) < StudyOptions.sSwipeMaxOffPath && !mIsXScrolling && !mIsSelecting) {
                // left
                executeCommand(mGestureSwipeLeft);
            }

            mIsXScrolling = false;
            mIsYScrolling = false;
         } catch (Exception e) {
            Log.e(AnkiDroidApp.TAG, "onFling Exception = " + e.getMessage());
         }
    }
    return false;
}

【问题讨论】:

  • 下次请使用格式化按钮格式化您的代码。我已经为你编写了它,但它仍然需要对缩进进行一些调整。另外,添加“它不起作用”的意思。这是做什么的,你期望它做什么(以及为什么),你的日志说什么等等。多一点努力会更容易回答这个

标签: android swipe


【解决方案1】:

好的。转自其他话题:

这是我能想到的最简单的 flinger 工作版本。 实际上,您可以将它绑定到任何组件,而不仅仅是 ImageView。

public class MyActivity extends Activity {

private void onCreate() {
    final ImageView imageView  = (ImageView) findViewById(R.id.image_view);
    imageView.setOnTouchListener(new OnTouchListener() {
        @Override
        public boolean onTouch(final View view, final MotionEvent event) {
            gdt.onTouchEvent(event);
            return true;
        }
    });
}

private final GestureDetector gdt = new GestureDetector(new GestureListener());

private static final int SWIPE_MIN_DISTANCE = 120;
private static final int SWIPE_THRESHOLD_VELOCITY = 200;
private class GestureListener extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            return true; // Right to left
        }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
            return true; // Left to right
        }
        if(e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            return true; // Bottom to top
        }  else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityY) > SWIPE_THRESHOLD_VELOCITY) {
            return true; // Top to bottom
        }
        return false;
    }
}

}

它不仅可以捕获水平方向,还可以捕获垂直方向(如果不需要,只需删除垂直部分),并且水平滑动具有优先级,如您所见。 在方法返回的地方(我的 cmets 所在的地方)只需调用您的方法或其他任何方法 :)

【讨论】:

    【解决方案2】:

    如果您使用触摸输入,则应返回 true 以表明它不会传递它

    还要确保你有 setOnTouchListener 否则不会使用你的 ontouchlistener

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2012-11-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-10-22
      • 2021-03-21
      • 1970-01-01
      相关资源
      最近更新 更多