模拟触摸事件进行长按操作

3

我们如何通过触摸事件模拟长按,或者如何计算屏幕在ACTION_DOWN状态下被触摸的时间?

4个回答

14

我终于成功实现了触摸屏长按功能,感谢大家。

textView.setOnTouchListener(new View.OnTouchListener() {

    private static final int MIN_CLICK_DURATION = 1000;
    private long startClickTime;

    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {
        case MotionEvent.ACTION_UP:
            longClickActive = false;
            break;
        case MotionEvent.ACTION_DOWN:
            if (longClickActive == false) {
                longClickActive = true;
                startClickTime = Calendar.getInstance().getTimeInMillis();
            }
            break;
        case MotionEvent.ACTION_MOVE:
            if (longClickActive == true) {
                long clickDuration = Calendar.getInstance().getTimeInMillis() - startClickTime;
                if (clickDuration >= MIN_CLICK_DURATION) {
                    Toast.makeText(MainActivity.this, "LONG PRESSED!",Toast.LENGTH_SHORT).show();
                    longClickActive = false;
                }
            }
            break;
        }
        return true;
    }
});

其中private boolean longClickActive = false;是一个类变量。


2
谢谢,这为我提供了一个解决方案。 - ctapp1
问题在于长按等待 ACTION_MOVE,但有时不会被调用,但必须捕获长按。 - sadegh saati

3

试试这个。你不需要去寻找对此的黑客攻击。

final GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() {
 public void onLongPress(MotionEvent e) {
  Log.e("", "Longpress detected");
 }
});

public boolean onTouchEvent(MotionEvent event) {
 if (gestureDetector.onTouchEvent(event)) {
  return true;
 }
 switch (event.getAction()) {
  case MotionEvent.ACTION_UP:
   break;
  case MotionEvent.ACTION_DOWN:
   break;
  case MotionEvent.ACTION_MOVE:
   break;
 }
 return true;
}
};

2
为了计算触摸次数,您可以获取事件的getPointerCount(),就像这里所示。
至于长按,也许这篇文章会有所帮助。 编辑:希望这个链接能帮助您确定触摸持续时间。

我需要时间,不是计数,伙计。 - Soheil Setayeshi
1
也许我没有理解你的意思,所以希望修改后的答案和附加的链接能够更好地帮助你,祝你好运。 - Arash GM
这不完全是我的答案,但是它启发了我使用布尔标志。谢谢 :D - Soheil Setayeshi

1
你需要计算 ACTION_DOWN 和 ACTION_UP 事件之间的时间。 仅在 ACTION_DOWN 状态下计算这段时间是不可能的,因为它是表示 TAP 或 LONG TAP 事件序列的起始事件。

谢谢,我是通过使用ACTION_DOWN和ACTION_MOVE完成的。 - Soheil Setayeshi

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接