How to implement a "Two Finger Drag" gesture on Android?
Asked Answered
F

3

14

I am new to Android development and am working on an accessibility research project for blind people (Jelly Bean API level 17 project). I have been experimenting with some gestures and the Two-Finger-Drag gesture has been really tough to implement. The following image captures what I actually require quite well.

drag gesture

I want the blind user to drag two fingers across horizontally (anywhere on the screen) and he would obtain an Audio output of the text he/she typed in the EditText. Also according to the distance the two fingers travel while dragging, we output each word separately.(Example below)

Example: If the user types "Today is a good day" and drags his finger (x value) by (say) 10 units to Left we output "good day" but if he drags it say 20 units to Left we output "a good day", for 30 units to Left "is a good day" etc etc.

I stumbled across which seems to detect two-finger touch:

TouchEvent(MotionEvent event)

Also this tutorial on detecting multiple touches seems promising, but I need it to work for touch and drag which I am not sure can be implemented like this.

Any new suggestions to implement this or pointers to tutorials that can help would be great!

Thanks in advance, Adit

Find answered 11/2, 2013 at 18:30 Comment(1)
Hello @Adit.. could you share the playstore link pleaseNebulosity
F
22

Okay So thanks to Gabe here and numerous blogs on this, I have found a solution to my question!

First I initialized my variables in the "Activity" class

int GLOBAL_TOUCH_POSITION_X = 0;
int GLOBAL_TOUCH_CURRENT_POSITION_X = 0;

Next, Inside the onCreate():

//Two-Finger Drag Gesture detection
    RelativeLayout TextLoggerLayout = (RelativeLayout)findViewById(R.id.ActivityrView);
    TextLoggerLayout.setOnTouchListener(
            new RelativeLayout.OnTouchListener(){

                @Override
                public boolean onTouch(View v, MotionEvent m) {
                    handleTouch(m); 
                    return true;
                }

    });

Now define the function handleTouch(m) as follows, it outputs the current position of the "Two-finger-touch" along with the initial position of the touch:

void handleTouch(MotionEvent m){
    //Number of touches
    int pointerCount = m.getPointerCount();
    if(pointerCount == 2){
        int action = m.getActionMasked();
        int actionIndex = m.getActionIndex();
        String actionString;
        TextView tv = (TextView) findViewById(R.id.testDiffText);
        switch (action)
        {
            case MotionEvent.ACTION_DOWN:                   
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            case MotionEvent.ACTION_UP:                 
                GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
                actionString = "UP"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);  
                break;  
            case MotionEvent.ACTION_MOVE:
                GLOBAL_TOUCH_CURRENT_POSITION_X = (int) m.getX(1);
                int diff = GLOBAL_TOUCH_POSITION_X-GLOBAL_TOUCH_CURRENT_POSITION_X;
                actionString = "Diff "+diff+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);                   
                break;
            case MotionEvent.ACTION_POINTER_DOWN:
                GLOBAL_TOUCH_POSITION_X = (int) m.getX(1);
                actionString = "DOWN"+" current "+GLOBAL_TOUCH_CURRENT_POSITION_X+" prev "+GLOBAL_TOUCH_POSITION_X;
                tv.setText(actionString);
                break;
            default:
                actionString = "";
        }

        pointerCount = 0;
    }
    else {
        GLOBAL_TOUCH_POSITION_X = 0;
        GLOBAL_TOUCH_CURRENT_POSITION_X = 0;
    }
}

There you have it! The "Two-finger-drag" gesture finally implemented. Looks, like I can wrte a tiny blog post on it as well!! :)

Find answered 14/2, 2013 at 11:36 Comment(2)
could you check this question pleaseNebulosity
Why you do not use the actionIndex ?Juback
S
4

I don't know how relevant adding an answer now would be to such an old question but I have been developing a library to support basic 1 and 2 finger gestures on Android with a very very simple drop in functionality.

Most gestures can be set as easily as

view.setOn2FingerGestureListener ( new On2FingerGestureListener () {
@Override 
onSwipeup() {
}
onSwipedown() {
}
});

It is open source as well as available to be downloaded as a .jar

Soane answered 13/4, 2014 at 20:59 Comment(1)
From another answer by @Arnav, the library is here: github.com/championswimmer/SimpleFingerGestures_Android_LibraryOrethaorferd
E
3

Touch and drag is a series of events. First you have a down, then you have 1 or more moves, then you have an up. You detect a starting point on the down, then the drag occurs on the moves. THe drag stops on an up.

To do a 2 finger drag, only pay attention to drags if MotionEvent.getPointerCount() == 2.

Ephialtes answered 11/2, 2013 at 18:51 Comment(1)
detect the point where the user first touches (the down event). Store it. On a move event, check if 2 fingers are down. If so, check how far its been moved by subtracting the point from the down. Scroll that much.Ephialtes

© 2022 - 2024 — McMap. All rights reserved.