logo
down
shadow

swipe gestures on android in unity


swipe gestures on android in unity

By : Gerald de los Santos
Date : November 22 2020, 10:33 AM
I hope this helps you . The issue you're facing is because you've done your checks in the TouchPhase.Ended. What you want to do is perform your checks in TouchPhase.Moved, with a smaller change in value (you're using 80 in Ended, try something like 10 if you the code doesn't work)
Unity's documentation on TouchPhase http://docs.unity3d.com/ScriptReference/TouchPhase.html
code :
    foreach(Touch touch in Input.touches)
    {

        if (touch.phase == TouchPhase.Began)
        {
            fingerStart = touch.position;
            fingerEnd  = touch.position;
        }
        if (touch.phase == TouchPhase.Moved )
        {
            fingerEnd = touch.position;

            if((fingerStart.x - fingerEnd.x) > 80 || 
               (fingerStart.x - fingerEnd.x) < -80) // Side to side Swipe
            {
                leftRight ++;
            }
            else if((fingerStart.y - fingerEnd.y) < -80 || 
                    (fingerStart.y - fingerEnd.y) > 80) // top to bottom swipe
            {
                upDown ++;

            }
            if(leftRight >= 3){

                leftRight = 0;
            }
            if(upDown >= 4){

                upDown = 0;
            }

            //After the checks are performed, set the fingerStart & fingerEnd to be the same
            fingerStart = touch.position;   

        }
        if(touch.phase == TouchPhase.Ended)
        {
            leftRight = 0;
            upDown = 0;
            fingerStart = Vector2.zero;
            fingerEnd = Vector2.zero;
        }
private Vector2 fingerStart;
private Vector2 fingerEnd;

public enum Movement
{
    Left,
    Right, 
    Up,
    Down
};

public List<Movement> movements = new List<Movement>();


void Update () {
    foreach(Touch touch in Input.touches)
    {

        if (touch.phase == TouchPhase.Began) {
            fingerStart = touch.position;
            fingerEnd  = touch.position;
        }

        if(touch.phase == TouchPhase.Moved) {
            fingerEnd = touch.position;

            //There is more movement on the X axis than the Y axis
            if(Mathf.Abs(fingerStart.x - fingerEnd.x) > Mathf.Abs(fingerStart.y - fingerEnd.y)) {

                //Right Swipe
                if((fingerEnd.x - fingerStart.x) > 0)
                    movements.Add(Movement.Right);
                //Left Swipe
                else
                    movements.Add(Movement.Left);

            }

            //More movement along the Y axis than the X axis
            else {
                //Upward Swipe
                if((fingerEnd.y - fingerStart.y) > 0)
                    movements.Add(Movement.Up);
                //Downward Swipe
                else
                    movements.Add(Movement.Down);
            }
            //After the checks are performed, set the fingerStart & fingerEnd to be the same
            fingerStart = touch.position;   

            //Now let's check if the Movement pattern is what we want
            //In this example, I'm checking whether the pattern is Left, then Right, then Left again
            Debug.Log (CheckForPatternMove(0, 3, new List<Movement>() { Movement.Left, Movement.Right, Movement.Left } ));
        }


        if(touch.phase == TouchPhase.Ended)
        {
            fingerStart = Vector2.zero;
            fingerEnd = Vector2.zero;
            movements.Clear();
        }
    }
}


private bool CheckForPatternMove (int startIndex, int lengthOfPattern, List<Movement> movementToCheck) {

    //If the currently stored movements are fewer than the length of the pattern to be detected
    //it can never match the pattern. So, let's get out
    if(lengthOfPattern > movements.Count)
        return false;

    //In case the start index for the check plus the length of the pattern
    //exceeds the movement list's count, it'll throw an exception, so lets get out
    if(startIndex + lengthOfPattern > movements.Count)
        return false;

    //Populate a temporary list with the respective elements
    //from the movement list
    List<Movement> tMovements = new List<Movement>();
    for(int i = startIndex; i < startIndex + lengthOfPattern; i++)
        tMovements.Add(movements[i]);

    //Now check whether the sequence of movements is the same as the pattern you want to check for
    //The SequenceEqual method is in the System.Linq namespace
    return tMovements.SequenceEqual(movementToCheck);
}
    //The idea of a pattern match is to check for the exact same set of swipe gesture.
    //This requires the following conditions to be met
    // (a) The List of movements that need to be checked must be at least as long as the List of movements to check against.
    // (b) The correct indices should be used for the startIndex. In this case I'm just using 0 as the startIndex.
    // (c) Remember to clear the List right after you get a true return from the method, otherwise the next return will most likely be a false. 

    //Example - Training set is Left -> Right -> Left (This is what we want to check)
    // Step 1 - User swipes LEFT, method returns false because there are too few Movements to check
    // Step 2 - User swipes RIGHT, method returns false (same reason as above)

    // Step 3a - User swipes RIGHT (L, R, R now) - false, incorrect pattern (L, R, R instead of L, R, L)
    // Step 3b - User swipes LEFT (L, R, L now) - TRUE, Correct pattern!

    //Immediately clear if Step 3b happens otherwise Step 4 will occur

    // Step 4 - User swipes L or R (direction is immaterial right now), and method will return FALSE
    // if you use the last three indexes!



    //Pre-populating the movements List with L, R, L
    movements = new List<Movement>()
    {
        Movement.Left,
        Movement.Right,
        Movement.Left
    };

    //Checking a match against an L, R, L training set
    //This prints true to the console
    Debug.Log (CheckForPatternMove(0, 3, new List<Movement>() { Movement.Left, Movement.Right, Movement.Left }  ));
void Update () {

    //Example usage in Update. Note how I use Input.GetMouseButton instead of Input.touch

    //GetMouseButtonDown(0) instead of TouchPhase.Began
    if (Input.GetMouseButtonDown(0)) {
        fingerStart = Input.mousePosition;
        fingerEnd  = Input.mousePosition;
    }

    //GetMouseButton instead of TouchPhase.Moved
    //This returns true if the LMB is held down in standalone OR
    //there is a single finger touch on a mobile device
    if(Input.GetMouseButton(0)) {
        fingerEnd = Input.mousePosition;

        //There was some movement! The tolerance variable is to detect some useful movement
        //i.e. an actual swipe rather than some jitter. This is the same as the value of 80
        //you used in your original code.
        if(Mathf.Abs(fingerEnd.x - fingerStart.x) > tolerance || 
           Mathf.Abs(fingerEnd.y - fingerStart.y) > tolerance) {

            //There is more movement on the X axis than the Y axis
            if(Mathf.Abs(fingerStart.x - fingerEnd.x) > Mathf.Abs(fingerStart.y - fingerEnd.y)) {
                //Right Swipe
                if((fingerEnd.x - fingerStart.x) > 0)
                    movements.Add(Movement.Right);
                //Left Swipe
                else
                    movements.Add(Movement.Left);
            }

            //More movement along the Y axis than the X axis
            else {
                //Upward Swipe
                if((fingerEnd.y - fingerStart.y) > 0)
                    movements.Add(Movement.Up);
                //Downward Swipe
                else
                    movements.Add(Movement.Down);
            }

            //After the checks are performed, set the fingerStart & fingerEnd to be the same
            fingerStart = fingerEnd;

            //Now let's check if the Movement pattern is what we want
            //In this example, I'm checking whether the pattern is Left, then Right, then Left again
            Debug.Log (CheckForPatternMove(0, 3, new List<Movement>() { Movement.Left, Movement.Right, Movement.Left } ));
        }
    }

    //GetMouseButtonUp(0) instead of TouchPhase.Ended
    if(Input.GetMouseButtonUp(0)) {
        fingerStart = Vector2.zero;
        fingerEnd = Vector2.zero;
        movements.Clear();
    }


}


Share : facebook icon twitter icon
Android: How to handle right to left swipe gestures

Android: How to handle right to left swipe gestures


By : LinuxWarlock
Date : March 29 2020, 07:55 AM
this will help I want my app to recognize when a user swipes from right to left on the phone screen. , OnSwipeTouchListener.java:
code :
import android.content.Context;
import android.view.GestureDetector;
import android.view.GestureDetector.SimpleOnGestureListener;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;

public class OnSwipeTouchListener implements OnTouchListener {

    private final GestureDetector gestureDetector;

    public OnSwipeTouchListener (Context ctx){
        gestureDetector = new GestureDetector(ctx, new GestureListener());
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        return gestureDetector.onTouchEvent(event);
    }

    private final class GestureListener extends SimpleOnGestureListener {

        private static final int SWIPE_THRESHOLD = 100;
        private static final int SWIPE_VELOCITY_THRESHOLD = 100;

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

        @Override
        public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
            boolean result = false;
            try {
                float diffY = e2.getY() - e1.getY();
                float diffX = e2.getX() - e1.getX();
                if (Math.abs(diffX) > Math.abs(diffY)) {
                    if (Math.abs(diffX) > SWIPE_THRESHOLD && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffX > 0) {
                            onSwipeRight();
                        } else {
                            onSwipeLeft();
                        }
                        result = true;
                    }
                }
                else if (Math.abs(diffY) > SWIPE_THRESHOLD && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                    if (diffY > 0) {
                        onSwipeBottom();
                    } else {
                        onSwipeTop();
                    }
                    result = true;
                }
            } catch (Exception exception) {
                exception.printStackTrace();
            }
            return result;
        }
    }

    public void onSwipeRight() {
    }

    public void onSwipeLeft() {
    }

    public void onSwipeTop() {
    }

    public void onSwipeBottom() {
    }
}
imageView.setOnTouchListener(new OnSwipeTouchListener(MyActivity.this) {
    public void onSwipeTop() {
        Toast.makeText(MyActivity.this, "top", Toast.LENGTH_SHORT).show();
    }
    public void onSwipeRight() {
        Toast.makeText(MyActivity.this, "right", Toast.LENGTH_SHORT).show();
    }
    public void onSwipeLeft() {
        Toast.makeText(MyActivity.this, "left", Toast.LENGTH_SHORT).show();
    }
    public void onSwipeBottom() {
        Toast.makeText(MyActivity.this, "bottom", Toast.LENGTH_SHORT).show();
    }

});
Android, how to emulate swipe gestures in AVD?

Android, how to emulate swipe gestures in AVD?


By : user3377121
Date : March 29 2020, 07:55 AM
I wish did fix the issue. How do I simulate swipe gestures (left and right, for example) on AVD? Is it possible at all? (In Android Developer's Guide - Emulator I can't find them... , Just click and hold and move the mouse to created the desired motion.
Handle Swipe Up, Swipe Down, Swipe Left & Swipe Right Gestures in a WinRT app

Handle Swipe Up, Swipe Down, Swipe Left & Swipe Right Gestures in a WinRT app


By : Paxfia
Date : March 29 2020, 07:55 AM
this one helps. Manipulation events provide you the translation values. Manipulation Delta will fire continuously until your manipulation completed along with inertia. In this event check whether the move is inertial, (a normal move shouldn't be considered as swipe) and detect the difference between initial and current position.
Once it reached the threshold, fire the swipe up/down/left/right event. And stop the manipulation immediately to avoid firing the same event again and again.
code :
    private Point initialpoint;

    private void Grid_ManipulationStarted_1(object sender, ManipulationStartedRoutedEventArgs e)
    {
        initialpoint = e.Position;
    }

    private void Grid_ManipulationDelta_1(object sender, ManipulationDeltaRoutedEventArgs e)
    {
        if (e.IsInertial)
        {
            Point currentpoint = e.Position;
            if (currentpoint.X - initialpoint.X >= 500)//500 is the threshold value, where you want to trigger the swipe right event
            {
                System.Diagnostics.Debug.WriteLine("Swipe Right");
                e.Complete();
            }
        }
    }
Make UIControl only accept swipe gestures and pass along touch/tap gestures

Make UIControl only accept swipe gestures and pass along touch/tap gestures


By : user2612078
Date : March 29 2020, 07:55 AM
this will help This question is similar to yours. Subclass your UIControl and override - (UIView *)hitTest:(CGPoint)point withEvent:(UIEvent *)event and call its super variant to pass it up to its view.
Swipe Gestures not working on Android

Swipe Gestures not working on Android


By : Jonathan Parker
Date : March 29 2020, 07:55 AM
seems to work fine Fixed it!
Swipe gestures seemed to work randomly but it was actually only working on the limited space of the components that were wrapped by the
code :
return (
    <GestureRecognizer
      onSwipe={(direction, state) => this.onSwipe(direction, state)}
      config={config}
      style={styles.container}
    >
      <View />
    </GestureRecognizer>
  )
Related Posts Related Posts :
  • FastAdapter: Undo button does not show up after swipe
  • What are reasons to pass getActivity as the LifecycleOwner to the LiveData's observe method in a fragment?
  • Implement Face Recognition in Android
  • Titanium studio cannot run "titanium" command in terminal
  • How to execute command line ffmpeg commands programatically in android?
  • Make Android List Items clickable with each item pointing to a different link
  • listview runs successfully, but nothing is display in emulator
  • How to zoom in a bitmap with high resolution?
  • Passing listView data through intent
  • Google map route direction show by arrows in android v2
  • how to start "uiautomator test run" from android code?
  • Proguard in Android Library
  • Alarm Clock from GIT - Gives error - Android
  • Mock injection using Mockito - Android
  • Get Bitmap from universal image loader
  • Unable to include custom font in android
  • Basics on using logcat in Android development
  • Android: Clear cache programmatically
  • Android: pass object without serialization
  • Can not scroll and click item on gridview inside scrollview
  • Android device keeps disconnecting from adb / eclipse
  • Volley cannot create cache directory. Could not clean up file
  • ShareActionProvider icon in actionbar
  • How to open a custom attachment using an Android app?
  • Unable to add column dynamically into the sqlite table
  • android persistence activity which never stop
  • The Google Play services resources were not found. Check your project configuration to ensure that the resources are inc
  • How to select files from google drive in android?
  • Run a AsyncTask every 10 seconds until cancelled
  • Blur on touch. Android application
  • NDK Android - Can't build ARMv5 and V7 at the same time
  • Android development with Eclipse clean and build
  • How to set Different Key Background for every Key in Android Custom Keyboard
  • Face recognition using OpenCV in android?
  • Tumblr API - Jumblr for Android [OAuthConnectionException]
  • Small Icon on Notification not working correctly
  • ConstraintLayout match parent height on larger screens but scroll on smaller
  • Kotlin version issue
  • How can i make my android app look the same on RTL and LTR languages?
  • Can not detect Android NDK toolchain
  • Falling back on PROMPT mode since _cordovaNative is missing. Expected for Android 3.2 and lower only.
  • Facebook Key Hash for Play Store Release
  • backbutton confirm exit app android + phonegap + jquery
  • How to Make Instagram Listview in android?
  • Up and Down Enemy Movement using translate corona sdk
  • Set selection method is not working in gallery in android
  • How to implement onOptionsItemSelected for Sub-Menu Items?
  • HttpHostConnectException connection refused ConnectException ErrnoException
  • Adding Buttons to expendableListView as last Child
  • Android. Block phone on startup
  • How to programmatically check If string is not to wide to fit onto the screen in Android
  • EditText box cursor appear after touching box?
  • using if statement when video is done playing
  • Add to Aspectpath not found MonkeyTalk
  • GooglePlusUtil cannot be resolved (Android)
  • Trouble understanding Relative Layout
  • How to title/name each fragment separately to appear on PagerTitleStrip?
  • Android webView blinks
  • Available service types in WifiP2pDnsSdServiceInfo.newInstance
  • Hide only bottom action bar Android
  • shadow
    Privacy Policy - Terms - Contact Us © ourworld-yourmove.org