如何在同一个ListView中同时实现ontouch和onfling?

16

我有一个ListView,实现了OnItemClick和OnFling。问题是当我滑动(从左向右)时,ListView的OnClick事件也会被执行。如何解决这个问题?在ListView中如何区分点击和滑动?

     listClickListener = new OnItemClickListener() {

           public void onItemClick(AdapterView<?> parent, View v,int position, long id) {
            //Job of Onclick Listener     
           }
      };
       mContactList.setOnItemClickListener(listClickListener); 
        mContactList.setAdapter(adapter);
        // Gesture detection 
        gestureDetector = new GestureDetector(new MyGestureDetector(prosNos)); 
         gestureListener = new View.OnTouchListener() { 
             public boolean onTouch(View v, MotionEvent event) { 
                 if (gestureDetector.onTouchEvent(event)) { 
                     return true; 
                 } 
                 return false; 
             } 
         }; 

         mContactList.setOnTouchListener(gestureListener); 

        }

     public class MyGestureDetector extends SimpleOnGestureListener { 

        @Override 
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
           // My fling event
           return false;
        }
    }

顺便问一下,我能否注释ListView的OnClickListener并将相同的逻辑编写在任何onTouchEvent中?但我仍然毫不怀疑onFling会调用onTouch。 我是对的吗?


1
尝试查看以下链接获取更多信息,它们可以帮助我实现您正在寻找的内容。http://www.zdnet.com/blog/burnette/how-to-use-multi-touch-in-android-2-part-3-understanding-touch-events/1775 http://android-journey.blogspot.com/2010/01/android-gestures.html - Emile
@Emile:感谢您的帖子。当我在MyGestureDetector类中覆盖ontouch函数时,它不起作用。这是可能的吗?否则我必须在touchlistener中实现它吗? - Ads
1
是的,我也发现了。是的,有点令人困惑。很多例子会让你在onTouch方法中添加代码,但你通常希望这与MyGestureDetector类的方法相关联。 - Emile
我会发一个例子。不能保证它能正常工作,因为它更像是伪代码。 - Emile
2个回答

20

为了澄清上面的评论,提供一段伪代码来说明如何调用MySimpleGestureListener的onTouch方法。

public class GestureExample extends Activity {

    protected MyGestureListener myGestureListener;

    @Override
    protected void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);

        myGestureListener = new MyGestureListener(this);
        // or if you have already created a Gesture Detector.
        //   myGestureListener = new MyGestureListener(this, getExistingGestureDetector());


        // Example of setting listener. The onTouchEvent will now be called on your listener
        ((ListView)findViewById(R.id.ListView)).setOnTouchListener(myGestureListener);


    }


    @Override
    public boolean onTouchEvent(MotionEvent event) {
        // or implement in activity or component. When your not assigning to a child component.
        return myGestureListener.getDetector().onTouchEvent(event); 
    }


    class MyGestureListener extends SimpleOnGestureListener implements OnTouchListener
    {
        Context context;
        GestureDetector gDetector;

        public MyGestureListener()
        {
            super();
        }

        public MyGestureListener(Context context) {
            this(context, null);
        }

        public MyGestureListener(Context context, GestureDetector gDetector) {

            if(gDetector == null)
                gDetector = new GestureDetector(context, this);

            this.context = context;
            this.gDetector = gDetector;
        }


        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {

            return super.onFling(e1, e2, velocityX, velocityY);
        }

        @Override
        public boolean onSingleTapConfirmed(MotionEvent e) {

            return super.onSingleTapConfirmed(e);
        }





        public boolean onTouch(View v, MotionEvent event) {

            // Within the MyGestureListener class you can now manage the event.getAction() codes.

            // Note that we are now calling the gesture Detectors onTouchEvent. And given we've set this class as the GestureDetectors listener 
            // the onFling, onSingleTap etc methods will be executed.
            return gDetector.onTouchEvent(event);
        }


        public GestureDetector getDetector()
        {
            return gDetector;
        }       
    }
}

2
请注意,虽然这澄清了onTouch事件,但它并没有严格回答列表视图上触发tap事件的问题。我认为问题可能在于您的onFling代码。您需要确保在检测到足够的快速滑动时返回true。这样,您就可以捕获事件并阻止其他方法/检测被解释。 - Emile
你找到了我的确切问题...非常抱歉,当事件执行时我忘记返回true了。 - Ads
在模拟器上,onfling方法运行良好。但在设备上却无法工作?我希望设备能够识别手势。如何使其正常工作? - Ads
我只想说,当我在onDown()中返回true时,这对我起作用了。 - kkudi

0

捕获多次点击事件

我用以下方法解决了这个问题,非常简单!

Object.setOnTouchListener( new View.OnTouchListener() {
            @Override
            public boolean onTouch(View view, MotionEvent event) {
                int action = event.getActionMasked();

                switch (action) {
                    case MotionEvent.ACTION_DOWN:
                        // button press
                        initialX = event.getX();
                        initialY = event.getY();
                        break;

                    case MotionEvent.ACTION_UP:

                        //button release
                        float finalX = event.getX();
                        float finalY = event.getY();

                       if (initialX > finalX)
                       {
                           //Right to Left swipe performed
                       }
                       if (initialX < finalX)
                       {
                           //Left to Right swipe performed
                       }
                       if (initialY < finalY) {
                           //Log.d( TAG, "Up to Down swipe performed" );
                       }
                       if (initialY > finalY) {
                           //Log.d( TAG, "Down to Up swipe performed" );
                       }
                       break;
                   case MotionEvent.ACTION_CANCEL:
                       Log.d( TAG, "Action was CANCEL" );
                       break;
                   case MotionEvent.ACTION_OUTSIDE:
                       Log.d( TAG, "Movement occurred outside bounds of current screen element" );
                       break;
                   case MotionEvent.ACTION_MOVE:
                       Toast.makeText(getApplicationContext(), "Action was MOVE",Toast.LENGTH_SHORT ).show();
                       break;


                }
                return true;
            }
        } );

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