【问题标题】:Detecting swipes, click, hold on one View Android检测滑动、单击、按住一个 View Android
【发布时间】:2016-06-17 16:18:21
【问题描述】:

我有一个ImageView,它填满了我的整个Activity。我需要能够检测到 4 个触摸事件:

  • 保持(超过 400 毫秒)
  • 点击
  • 向左滑动
  • 向右滑动

目前我可以使用以下代码检测前两个:

imageView.setOnTouchListener(new View.OnTouchListener() {

    private Timer timerr = new Timer();
    private long LONG_PRESS_TIMEOUT = 400; // TODO: your timeout here
    private boolean wasLong = false;

    @Override
    public boolean onTouch(View v, MotionEvent event) {
      Log.d(getClass().getName(), "touch event: " + event.toString());

      if (event.getAction() == MotionEvent.ACTION_DOWN) {
       // HOLD DETECTED
       timerr.schedule(new TimerTask() {
          @Override
          public void run() {
            SlideShow.this.runOnUiThread(new Runnable() {
              @Override
              public void run() {

              }, LONG_PRESS_TIMEOUT);
             return true;
            }

            if (event.getAction() == MotionEvent.ACTION_UP) {
             if (!isPaused && !wasLong) {
              // CLICK DETECTED
              timerr.cancel();
              timerr = new Timer();
              if (!wasLong) {

               return false;
              }
             });

现在我正在尝试使用此问题中的代码来实现向右滑动和向左滑动动作。 Android Swipe on List 问题在于它适用于列表视图,您可以在其中为整个列表视图实现onTouchListener,并为列表项实现单独的onItemClickListener。尽管只有一个 Listener 可用,但我不知道如何适应这种情况。

【问题讨论】:

    标签: java android listview listener swipe-gesture


    【解决方案1】:

    手势检测器是要走的路。

    或者,

     image.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
    
                switch (event.getAction()) {
    
                    case MotionEvent.ACTION_DOWN:
                        x1 = event.getX();
                        y1 = event.getY();
                        t1 = System.currentTimeMillis();
                        return true;
                    case MotionEvent.ACTION_UP:
                        x2 = event.getX();
                        y2 = event.getY();
                        t2 = System.currentTimeMillis();
    
                        if (x1 == x2 && y1 == y2 && (t2 - t1) < CLICK_DURATION) {
                            Toast.makeText(getActivity(), "Click", Toast.LENGTH_SHORT).show();
                        } else if ((t2 - t1) >= CLICK_DURATION) {
                            Toast.makeText(getActivity(), "Long click", Toast.LENGTH_SHORT).show();
                        } else if (x1 > x2) {
                            Toast.makeText(getActivity(), "Left swipe", Toast.LENGTH_SHORT).show();
                        } else if (x2 > x1) {
                            Toast.makeText(getActivity(), "Right swipe", Toast.LENGTH_SHORT).show();
                        } 
    
    
                        return true;
                }
    
                return false;
            }
    

    【讨论】:

    • 感谢您提供完美的解决方案!
    【解决方案2】:

    在继续之前,您应该通读this guide on detecting gestures。 Android 已将滑动检测嵌入到GestureDetector

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2013-05-22
      • 2012-07-27
      • 1970-01-01
      • 2017-03-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多