Adding Fling Gesture to an image view - Android

前端 未结 8 1220
南方客
南方客 2020-11-27 11:37

Okay I have been referencing the code here: Fling gesture detection on grid layout

but just can not get it to work. In my main activity I have a simple image define

8条回答
  •  无人及你
    2020-11-27 12:13

    If you're looking for a method like ImageView.setOnGestureListener, there is none. You can go look at the Android source code. Your best option is to handle it in onTouch() of the View object.

    This is the simplest GestureDetector I can make.

    I have a class called GenesMotionDetector.java. Here's the code for it:

    package gene.com.motioneventssample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.widget.ImageView;
    import android.widget.LinearLayout;
    import android.widget.TextView;
    
    public class GenesMotionDetector extends Activity implements GestureDetector.OnGestureListener {
        private GestureDetector gestureScanner;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.nothing);
            gestureScanner= new GestureDetector(getBaseContext(),this);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent me) {
            System.out.println("Inside onTouchEvent() of GenesMotionDetector.java");
            return gestureScanner.onTouchEvent(me);
        }
    
        @Override
        public boolean onDown(MotionEvent e) {
            System.out.println("Inside onDown() of GenesMotionDetector.java");
            return true;
        }
    
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            System.out.println("Inside onFling() of GenesMotionDetector.java");
            return true;
        }
    
        @Override
        public void onLongPress(MotionEvent e) {
            System.out.println("Inside onLongPress() of GenesMotionDetector.java");
        }
    
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            System.out.println("Inside onScroll() of GenesMotionDetector.java");
            return true;
        }
    
        @Override
        public void onShowPress(MotionEvent e) {
            System.out.println("Inside onShowPress() of GenesMotionDetector.java");
        }
    
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            System.out.println("Inside onSingleTapUp() of GenesMotionDetector.java");
            return true;
        }
    }
    

    The corresponding XML layout file for that class is nothing.xml. Here's the code for it:

    
    
    
    
        
    
        
    
    

    Now, taking the simplest GestureDetector I can make (from above) and modifying it for what you want, I get this:

    package gene.com.motioneventssample;
    
    import android.app.Activity;
    import android.os.Bundle;
    import android.view.GestureDetector;
    import android.view.MotionEvent;
    import android.view.VelocityTracker;
    import android.view.View;
    import android.widget.ImageView;
    
    public class GenesMotionDetector3 extends Activity implements GestureDetector.OnGestureListener {
        private GestureDetector gestureScanner;
        ImageView mView3;
    
        View.OnTouchListener gestureListener;
        MotionEvent initialME, finalME;
        private VelocityTracker mVelocityTracker = null;
    
        @Override
        public void onCreate(Bundle savedInstanceState) {
            super.onCreate(savedInstanceState);
            setContentView(R.layout.nothing);
    
    
            mView3 = (ImageView) findViewById(R.id.image);
    
            // Gesture detection
            gestureScanner = new GestureDetector(getBaseContext(), this);
    
            gestureListener = new View.OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    switch(event.getAction()){
                        case MotionEvent.ACTION_DOWN:
                            initialME= event;
    
                            if(mVelocityTracker == null) {
                                // Retrieve a new VelocityTracker object to watch the velocity of a motion.
                                mVelocityTracker = VelocityTracker.obtain();
                            }
                            else {
                                // Reset the velocity tracker back to its initial state.
                                mVelocityTracker.clear();
                            }
                            // Add a user's movement to the tracker.
                            mVelocityTracker.addMovement(event);
    
                            break;
                        case MotionEvent.ACTION_MOVE:
                            mVelocityTracker.addMovement(event);
                            // When you want to determine the velocity, call
                            // computeCurrentVelocity(). Then call getXVelocity()
                            // and getYVelocity() to retrieve the velocity for each pointer ID.
                            mVelocityTracker.computeCurrentVelocity(1000);
                            break;
                        case MotionEvent.ACTION_UP:
                            finalME=event;
                            break;
                        case MotionEvent.ACTION_CANCEL:
                            // Return a VelocityTracker object back to be re-used by others.
                            mVelocityTracker.recycle();
                            break;
                    }
                    return onFling(initialME, finalME, mVelocityTracker.getXVelocity(), mVelocityTracker.getYVelocity());
                    //return false;
                }
            };
    
            mView3.setOnTouchListener(gestureListener);
        }
    
        @Override
        public boolean onTouchEvent(MotionEvent me) {
            System.out.println("Inside onTouchEvent() of GenesMotionDetector.java");
    
            return gestureScanner.onTouchEvent(me);
        }
    
        @Override
        public boolean onDown(MotionEvent e) {
            System.out.println("Inside onDown() of GenesMotionDetector.java");
            return true;
        }
    
        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            System.out.println("Inside onFling() of GenesMotionDetector.java");
            System.out.println("e1= "+ e1);
            System.out.println("e2= "+ e2);
            System.out.println("velocityX= "+ velocityX);
            System.out.println("velocityY= "+ velocityY);
            return true;
        }
    
        @Override
        public void onLongPress(MotionEvent e) {
            System.out.println("Inside onLongPress() of GenesMotionDetector.java");
        }
    
        @Override
        public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
            System.out.println("Inside onScroll() of GenesMotionDetector.java");
            return true;
        }
    
        @Override
        public void onShowPress(MotionEvent e) {
            System.out.println("Inside onShowPress() of GenesMotionDetector.java");
        }
    
        @Override
        public boolean onSingleTapUp(MotionEvent e) {
            System.out.println("Inside onSingleTapUp() of GenesMotionDetector.java");
            return true;
        }
    }
    

    You might as well just handle everything in onTouch(). I'm basically getting the gestures in onTouch and passing it to onFling().

提交回复
热议问题