代码之家  ›  专栏  ›  技术社区  ›  Faisal Abid

ListView在ViewFlipper内滑动

  •  3
  • Faisal Abid  · 技术社区  · 14 年前

    我试着在ListView上左右滑动,然后让ViewFlipper切换到Swtich。就像RemebethEmilk应用程序和NexusOne上的默认新闻和天气应用程序(浏览新闻主题)。通过使用我发现的各种教程,我遇到了一个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 setOnitemlicklistener会被解雇。如何防止这种情况发生,并且只有当用户实际单击它的列表项而不仅仅是在上面滑动时,才会激发setOnitEmclickListener。

    谢谢, 阿比德

    3 回复  |  直到 11 年前
        1
  •  2
  •   Nikhil Agrawal    11 年前

    嗯,我发现的一种方法是不依赖,OniteClick,我实现了

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

    在simpleongestureListener中,它似乎可以工作

        2
  •  1
  •   Engin OZTURK    12 年前

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

    将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上使用。这将帮助您在ListView上向下/向上滚动并将所有内容委派给(向下/向上滚动并向Listener左/右滑动…等等)。

    相信它。很好用:d

        3
  •  0
  •   Nikhil Agrawal    11 年前

    我认为除了在代码中使用常量之外,您不能对它做太多的事情,这样当用户单击或想要滑动时,它的可判定性就更好了。例如,我在代码中使用了以下方法(我使用了触摸事件,但原理应该类似):

    @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条件下的值,直到它在几乎所有情况下都起作用。