【问题标题】:MotionEvent - How to do action on tap, not drag [duplicate]MotionEvent - 如何在点击时执行操作,而不是拖动 [重复]
【发布时间】:2019-01-01 16:14:56
【问题描述】:

我一直在在线和 StackOverflow 上搜索如何在 onTouchListener 中执行操作,如果事件是点击,而不是任何形式的动作,但我无法找到答案以及我的试过了也不管用。我有一个ListViewAdapter,在getView 方法中,我在listItem 上设置了onTouchListener

我想要做的是当listItem 被点击时,我想显示一个Toast,但如果事件是一个拖动(就像用户滚动列表) em>,我不想显示Toast

以下是我尝试过的代码。 (makeToast 是一个用于创建 Toast 的函数,events.getRelation() 是我想要在 Toast 中拥有的字符串。):

listItem.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_HOVER_ENTER) {
            makeToast(events.getRelation());
        } else if (event.getAction() == MotionEvent.ACTION_UP) {
            //  makeToast(events.getRelation());
        } else if (event.getAction() == MotionEvent.ACTION_SCROLL) {
            //   makeToast(events.getRelation());
        } else if (event.getAction() == MotionEvent.ACTION_MOVE) {
            // makeToast(events.getRelation());
        } else if (event.getAction() == MotionEvent.AXIS_SCROLL) {
            //   makeToast(events.getRelation());
        } else if (event.getAction() == MotionEvent.AXIS_VSCROLL) {
            //    makeToast(events.getRelation());
        } else {
            //makeToast(events.getRelation());
        }
        return false;
    }
});

我已经尝试在不同类型的MotionEvents 下使用makeToast 方法,但我仍然没有得到我想要的结果,因为Toast 根本没有创建,或者它是在我创建的时候创建的滚动,而不是点击。有人能帮我解决这个问题吗?我觉得这是一个简单的问题,但我一直找不到解决方案

【问题讨论】:

  • 这个问题与实现onTouchonClick 有关,因为onClick 永远不会在onTouch 之后调用。我的问题是区分滚动和点击以在点击上创建Toast
  • 我同意其他用户希望能够检测到onTouch() 中的点击/点击的原因与您的不同。但是由于你们俩都想实现相同的事情,请解释为什么其他帖子的答案对您的情况没有帮助。 (IMO 接受的自我回答并不是很好,但有不止一个其他答案解释了如何评估 DOWN 和 UP 之间的时间以做出决定)
  • 感谢 0X0nosugar。那篇文章的第二个答案帮助了我。在您发布之前我无法找到答案,所以谢谢。

标签: android listview touch listitem motionevent


【解决方案1】:

据我了解,我认为您希望将 Click listener 设置为整个活动!
为此,请添加ViewTreeObserver

ViewTreeObserver viewTreeObserver = myView.getViewTreeObserver();
viewTreeObserver.addOnGlobalLayoutListener(new OnGlobalLayoutListener() {
    //make Toast
}

来源:https://stackoverflow.com/a/18000128/9819031

【讨论】:

  • 我认为您没有理解我的问题。我知道如何制作Toast。我遇到的困难是检测触摸是轻敲还是动作,然后如果是轻敲则发出Toast。问题在于检测触摸与运动。
  • 好的,我会看到的
  • 查看编辑后的答案!
  • 感谢您尝试 Gourav,但我不想为整个活动设置 ClickListener,因为 ListView 中的每一行都会生成不同消息的 Toast。另外,我的问题是关于检测不同类型的MotionEvents,例如点击或拖动,而不是制作ToastsClickListeners
  • 告诉我一件事,你的活动中有列表视图吗?
【解决方案2】:

要在 android 中检测单击和双击,请使用以下方法

class GestureTap extends GestureDetector.SimpleOnGestureListener { @Override public boolean onDoubleTap(MotionEvent e) { Log.i("onDoubleTap :", "" + e.getAction()); return true; } @Override public boolean onSingleTapConfirmed(MotionEvent e) { Log.i("onSingleTap :", "" + e.getAction()); return true; } }

并在 onTouch 监听器中添加如下代码

@Override public boolean onTouchEvent(MotionEvent event) { new GestureDetector(this, new GestureTap()).onTouchEvent(event); return true; }

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2019-11-21
    • 2017-12-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多