【问题标题】:Listview Swipe inside viewflipperListview 在 vi​​ewflipper 内滑动
【发布时间】:2010-05-28 06:45:22
【问题描述】:

我试图在列表视图上左右滑动并让 viewflipper 切换。就像 remeberthemilk 应用程序和 nexus 上的默认新闻和天气应用程序一样(浏览新闻主题)。使用我找到的各种教程,我遇到了一个显示如何实现滑动手势的 stackoverflow

    class MyGestureDetector extends SimpleOnGestureListener {
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
        try {
            if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH)
                return true;
            // right to left swipe
            if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {


            }  else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
                viewFlipper.setInAnimation(slideRightIn);
                viewFlipper.setOutAnimation(slideRightOut);
                viewFlipper.showPrevious();
            }
        } catch (Exception e) {
            // nothing
        }
        return true;
    }
}

我通过这样做得到了这个工作

  lstView.setOnTouchListener(gestureListener);

但有时会发生的情况是当用户滑动时会触发 listview setOnItemClickListener。我如何防止这种情况发生,并且仅在用户实际单击它的列表项而不只是在其上滑动时才触发 setOnItemClickListener。

谢谢, 费萨尔·阿比德

【问题讨论】:

    标签: android listview


    【解决方案1】:

    我发现的一种方法是我实现了而不是依赖 onItemClick

    @Override
     public boolean onSingleTapConfirmed(MotionEvent e) {
    
         // TODO Auto-generated method stub
         Log.e("Item Click", "Item Click");
         return super.onSingleTapConfirmed(e);
    
     }
    

    在 SimpleOnGestureListener 内部,它似乎可以工作

    【讨论】:

      【解决方案2】:

      这是我使用的方式。这很简单。

      当您将 onTouchListener 分配给 ViewFlipper 时,首先为该侦听器创建引用。

      public class ViewFlipperTouchListener implements OnTouchListener {
         ....
         ......
      }
      
      
      ViewFlipperTouchListener listener = new ViewFlipperTouchListener ();
      
      mViewFlipper.setOnTouchListener(listener);
      
      
      
      //now you have reference to listener. use it to send on touch event.
      
      
      mListView.setOnTouchListener(new OnTouchListener(){
      
        @Override
        public boolean onTouch(View v, MotionEvent event){
           listener.onTouch(v, event);
       return false;
        }
      });
      

      我只是通过使用引用“listener”将 MotionEvent 委托给 viewflipper 的 onTouchListener。并返回 false 表示该事件未在 ListView 上使用。这将帮助您在列表视图上向下/向上滚动并委派所有内容(向下/向上滚动和向左/向右滑动......等到监听器。)..

      相信它。效果很好:D

      【讨论】:

      • 我们在哪里添加手势在列表视图上向左滑动?
      • 我相信同样的方式。您可以像上面那样捕获它并使用您的业务逻辑,然后将其委托给父视图。您可以使用自己的 GestureDetector 以不同方式处理它。但委托也会帮助您使用父视图
      【解决方案3】:

      我认为除了在代码中使用常量外,您无能为力,以便用户单击或想要滑动时更好地确定。例如我在我的代码中使用了以下方式(我使用了触摸事件,但原理应该类似):

      @Override
      public boolean onTouch(View view, MotionEvent event) {
      
          switch (event.getAction()) {
          case MotionEvent.ACTION_DOWN:
              {
                  downXValue = event.getX();
                  downTime = event.getEventTime();
                  break;
              }
      
          case MotionEvent.ACTION_UP:
              {
                  float currentX = event.getX();
                  long currentTime = event.getEventTime();
                  float difference = Math.abs(downXValue - currentX);
                  long time = currentTime - downTime;
      
                  Log.i("Touch Event:", "Distance: " + difference + "px Time: " + time + "ms");
      
                  if ((downXValue < currentX) && (time > 50) && (difference > 50)) {
                      showPrevious();
                  }
      
                  if ((downXValue > currentX) && (time > 50) && (difference > 50)) {
                      showNext();
                  }
                  break;
              }
          }
      }
      

      如您所见,我在那里放置了一个日志输出。所以我只是测试了应用程序,每次我尝试翻转或单击时,日志都会告诉我我按下了多长时间以及差异有多大。所以我在 if 条件下调整了我的值,直到它在几乎所有情况下都有效

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2013-05-11
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多