android - OnClick 抑制下面的 OnTouch

标签 android ontouchlistener onclicklistener

我有一个包含多个 ImageViews 的应用程序是可点击的。所有这些图像都在 LinearLayout 中.

我实现了一个 OnTouchListener并将其设置为 LinearLayout .当我滑过它时,我的 OnTouchListener调用函数。

问题是如果我开始滑过 ImageViews没有 OnClickListener OnTouchListener有效,但是当我开始滑动具有 OnClickListener 的图像时, 然后是 OnTouch函数不起作用(OnClickImageView 也不起作用,因为它是正常的)。

我想知道是否有办法让我的 ImageViewsonClick如果用户滑动而不是点击,则将操作传递给下面的 View ,如果用户只是点击,则不传递它。

提前致谢

最佳答案

我设法做到了,我找到的唯一方法是使用 SimpleOnGestureListener。如果有人遇到同样的问题,我会复制粘贴代码。

像这样创建一个类:

public abstract class MyGestureDetector extends SimpleOnGestureListener {

private static final int SWIPE_MIN_DISTANCE = 100;
private static final int SWIPE_THRESHOLD_VELOCITY = 50;
private GestureDetector gestureDetector;
private View.OnTouchListener gestureListener;
private Activity activity;

public MyGestureDetector(Activity activity) {
    this.activity = activity;
    gestureDetector = new GestureDetector(this);
    gestureListener = new View.OnTouchListener() {
        public boolean onTouch(View v, MotionEvent event) {
            return gestureDetector.onTouchEvent(event);
        }
    };
}

public abstract void onRightToLeftSwipe();

public abstract void onLeftToRightSwipe();

public abstract void onTopToBottomSwipe();

public abstract void onBottomToTopSwipe();

@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velX,
        float velY) {
    DisplayMetrics dm = activity.getResources().getDisplayMetrics();
    int REL_SWIPE_MIN_DISTANCE = (int) (SWIPE_MIN_DISTANCE * dm.densityDpi / 160.0f);
    int REL_SWIPE_THRESHOLD_VELOCITY = (int) (SWIPE_THRESHOLD_VELOCITY
            * dm.densityDpi / 160.0f);
    float deltaX = e1.getX() - e2.getX();
    float deltaY = e1.getY() - e2.getY();
    try {
        // swipe horizontal?
        if ((Math.abs(deltaX) > REL_SWIPE_MIN_DISTANCE)
                && (Math.abs(velX) > REL_SWIPE_THRESHOLD_VELOCITY)
                && (Math.abs(deltaX) > Math.abs(deltaY))) {
            // left or right
            if (deltaX < 0) {
                this.onLeftToRightSwipe();
                return true;
            }
            if (deltaX > 0) {
                this.onRightToLeftSwipe();
                return true;
            }
        } else if ((Math.abs(deltaY) > REL_SWIPE_MIN_DISTANCE)
                && (Math.abs(velY) > REL_SWIPE_THRESHOLD_VELOCITY)) { // swipe
            // vertical
            // top or down
            if (deltaY < 0) {
                this.onTopToBottomSwipe();
                return true;
            }
            if (deltaY > 0) {
                this.onBottomToTopSwipe();
                return true;
            }
        } else {
            return false; // We don't consume the event
        }

    } catch (Exception e) {
        // nothing
    }
    return false;
}

public View.OnTouchListener getGestureListener() {
    return gestureListener;
}

public void setGestureListener(View.OnTouchListener gestureListener) {
    this.gestureListener = gestureListener;
}
}

然后你必须在你的 Activity 中这样做:

public void onCreate(Bundle savedInstanceState) {
     // Initializate your variables here
     // Using Gestures
     MyGestureDetector gestos = new MyGestureDetector(this) {

        @Override
        public void onTopToBottomSwipe() {
            // Do whatever

        }

        @Override
        public void onRightToLeftSwipe() {
            // Do whatever
        }

        @Override
        public void onLeftToRightSwipe() {
            // Do whatever
        }

        @Override
        public void onBottomToTopSwipe() {
            // Do whatever

        }
    };

最后但并非最不重要的一点是,您必须将 TouchListener 置于您想要在其中滑动的布局以及该布局中可点击的每个 View

layoutSwipe = (LinearLayout) findViewById(R.id.layoutSwipe);
layoutSwipe.setOnTouchListener(gestos.getGestureListener());
viewInsidells.setOnTouchListener(gestos.getGestureListener());
view2Insidells.setOnTouchListener(gestos.getGestureListener());

有了这个,你可以在你的布局中使你的 View 可点击,如果你点击它只会执行你点击的 View 的点击操作,如果你滑动它只会根据你的移动执行滑动操作。

我花了 4 个小时试图解决这个问题,希望我能节省一些时间到下一个。

关于android - OnClick 抑制下面的 OnTouch,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12843965/

相关文章:

android - 为谷歌地图禁用 onClickListener

Android 将图像复制到剪贴板/clipdata

Android Facebook 应用程序与 GAE 的集成

android - dexguard混淆问题

android - Android Studio 中是否存在 "While-Clicking"事件处理程序?

android - 为什么 ACTION_DOWN 可能偶尔不会在 Android 中为 ListView 触发

Android Datepicker Fragment - 当用户设置日期时如何做某事?

android - 未检测到我的 MotionEvent.ACTION_DOWN

android - 强制关闭启动 Intent ,android list 中提到了该 Activity

javascript - 使用 addEventListener 或 onclick 调用时函数不起作用,不显示任何错误消息