Naseem Ahmad
Naseem Ahmad

Reputation: 103

get user movement on screen by touch listener but having an issue that the conditions are called numerous time

I want to get user finger location on screen so 

that to perform some actions like increase the volume when the user moves her finger upward but the problem I am facing that the code I want to run on user upward movement calls many times the even user just place her finger on screen any one can help me

layout.setOnTouchListener(new View.OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {

        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN: {
                // store the X value when the user's finger was pressed down
                downXValue = event.getX();
                downYValue = event.getY();
                Log.d("recording", "= " + downYValue);
                break;
            }

            case MotionEvent.ACTION_MOVE: {
                // Get the X value when the user released his/her finger
                float currentX = event.getX();
                float currentY = event.getY();
                // check if horizontal or vertical movement was bigger

                if (Math.abs(downXValue - currentX) > Math.abs(downYValue
                        - currentY)) {
                    Log.d("recording", "x");
                    // going backwards: pushing stuff to the right
                    if (downXValue < currentX) {
                        Log.d("recording", "right");

                    }

                    // going forwards: pushing stuff to the left
                    if (downXValue > currentX) {
                        Log.d("recording", "left");

                    }

                } else {
                    Log.d("recording", "y ");

                    if (downYValue < currentY) {
                        Log.d("recording", "down");




                        }
                    }
                    if (downYValue > currentY) {
                        Log.d("recording", "up");




                    }
                }
                break;
            }

        }

        return true;

    }


});

any one give me good suggestions that what should I do

Upvotes: 1

Views: 46

Answers (1)

Farmaan Elahi
Farmaan Elahi

Reputation: 1650

CUSTOME GESTURE LISTENER

import android.util.Log;
import android.view.GestureDetector;
import android.view.MotionEvent;


public class SimpleGestureListener extends GestureDetector.SimpleOnGestureListener {
    private static final String TAG = "SimpleGestureListener";
    private Listener mListener;

    @Override
    public boolean onDown(MotionEvent e) {
        return true;
    }

    @Override
    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
        Log.i(TAG,e1.toString()+"\n"+e2.toString());
        Log.d(TAG,"distanceX = "+distanceX+",distanceY = "+distanceY);
        if (mListener == null)
            return true;

        if (distanceX == 0 && Math.abs(distanceY) > 1){
            mListener.onScrollVertical(distanceY);
        }

        if (distanceY == 0 && Math.abs(distanceX) > 1){
            mListener.onScrollHorizontal(distanceX);
        }
        return true;
    }


    public void setListener(Listener mListener) {
        this.mListener = mListener;
    }

    interface Listener{
        /**
         * left scroll dx >0
         * right scroll dx <0
         * @param dx
         */
        void onScrollHorizontal(float dx);

        /**
         * upward scroll dy > 0
         * downward scroll dy < 0
         * @param dy
         */
        void onScrollVertical(float dy);
    }
}

USAGE

public class MainActivity extends AppCompatActivity {
    private static final String TAG = "MainActivity";
    private GestureDetector mDetector;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
        SimpleGestureListener simpleGestureListener = new SimpleGestureListener();
        simpleGestureListener.setListener(new SimpleGestureListener.Listener() {
            @Override
            public void onScrollHorizontal(float dx) {
                Log.i(TAG,"horizontal = " +dx);
            }

            @Override
            public void onScrollVertical(float dy) {
                Log.i(TAG,"vertical = " +dy);
            }
        });
        mDetector = new GestureDetector(this, simpleGestureListener);
    }

    @Override
    public boolean onTouchEvent(MotionEvent event) {
        mDetector.onTouchEvent(event);
        return super.onTouchEvent(event);
    }
}

You can use the above code in your application to track:

  1. left-right swipe
  2. top-down swipe

Upvotes: 1

Related Questions