Detect swipe using onTouchListener in ScrollView

30,303

Solution 1

I think this is what you are looking for:

Swipe event in android ScrollView

Solution 2

You must set OntouchListener to ScrollView.

ScrollView scrollView = (ScrollView)findViewById(R.id.scrollView1);
scrollView.setOnTouchListener(new View.OnTouchListener() {
            @Override
            public boolean onTouch(View v, MotionEvent event) {
                switch(event.getAction()){
                    case MotionEvent.ACTION_DOWN:{
                        downX = event.getX();}
                    case MotionEvent.ACTION_UP:{
                        upX = event.getX();

                        float deltaX = downX - upX;

                        if(Math.abs(deltaX)>0){
                            if(deltaX>=0){
                                swipeToRight();
                                return true;
                            }else{
                                swipeToLeft();
                                return  true;
                            }
                        }
                    }
                }

                return false;
            }
});
Share:
30,303
Jainendra
Author by

Jainendra

Send me a direct message

Updated on July 19, 2020

Comments

  • Jainendra
    Jainendra almost 4 years

    I'm using the following code to detect swipe in my Activity:

    getWindow().getDecorView().getRootView().setOnTouchListener(new OnTouchListener() {
                @Override
                public boolean onTouch(View v, MotionEvent event) {
                    int action = event.getAction();
                    if(action == MotionEvent.ACTION_DOWN){
    
                        downX = event.getX();
                        downY = event.getY();
                        //mSwipeDetected = Action.None;
                        return true; // allow other events like Click to be processed
                    }
                    else if(action == MotionEvent.ACTION_UP || action == MotionEvent.ACTION_CANCEL){
                         upX = event.getX();
                         upY = event.getY();
    
                         float deltaX = downX - upX;
                         float deltaY = downY - upY;
    
                        // horizontal swipe detection
                        if (Math.abs(deltaX) > MIN_DISTANCE) {
                            // left or right
                            if (deltaX < 0) {
                                Log.i(TAG, "Swipe Left to Right");
                                //mSwipeDetected = Action.LR;
                                onClickPrevQues(getWindow().getDecorView().getRootView());
    
                                return false;
                            }
                            if (deltaX > 0) {
                                Log.i(TAG, "Swipe Right to Left");
                                onClickNextQues(getWindow().getDecorView().getRootView());
                               // mSwipeDetected = Action.RL;
                                return false;
                            }
                        } else if (Math.abs(deltaY) > MIN_DISTANCE) { // vertical swipe
                                                                        // detection
                            // top or down
                            if (deltaY < 0) {
                                Log.i(TAG, "Swipe Top to Bottom");
                                //mSwipeDetected = Action.TB;
                                return false;
                            }
                            if (deltaY > 0) {
                                Log.i(TAG, "Swipe Bottom to Top");
                                //mSwipeDetected = Action.BT;
                                return false;
                            }
                        }
                        return false;
                    }
                    else if(action == MotionEvent.ACTION_MOVE){
                        return true;
                    }
                    return false;
                }
            });
    

    The code is working fine in case of LinearLayout. Surprisingly the same is not working in case if I wrap the Linearlayout inside ScrollView. What is the problem here?

    Edit:
    Layout:

        <?xml version="1.0" encoding="utf-8"?>
    <ScrollView
      xmlns:android="http://schemas.android.com/apk/res/android"
      android:layout_width="fill_parent"
      android:layout_height="fill_parent">
    <RelativeLayout 
        android:id="@+id/RelativeLayout1"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:background="#ffffff"
        android:gravity="center_horizontal" >
    
        <RelativeLayout
            android:id="@+id/RelativeLayout2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:paddingBottom="0dp"
            android:paddingLeft="620dip"
            android:paddingTop="15dip" >
    
            <TextView
                android:id="@+id/text_unattempted"
                android:layout_width="wrap_content"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:paddingTop="2dp"
                android:text="TextView"
                android:textColor="#b4cacc"
                android:textStyle="bold" />
        </RelativeLayout>
    
        <LinearLayout
            android:id="@+id/LinearLayout1"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_below="@+id/RelativeLayout2"
            android:gravity="center_horizontal"
            android:orientation="horizontal"
            android:paddingBottom="5dip"
            android:paddingTop="5dip" >
    
            <RelativeLayout
                android:id="@+id/relative_group"
                android:layout_width="fill_parent"
                android:layout_height="260dp"
                android:layout_marginLeft="20dp"
                android:orientation="vertical" >
    
                <TextView
                    android:id="@+id/txt_question_nu"
                    android:layout_width="180dp"
                    android:layout_height="wrap_content"
                    android:layout_alignParentLeft="true"
                    android:layout_alignParentTop="true"
                    android:paddingTop="0dp"
                    android:text="Question 1"
                    android:textColor="#b4cacc"
                    android:textSize="28dp"
                    android:textStyle="bold" />
    
                <TextView
                    android:id="@+id/question"
                    android:layout_width="fill_parent"
                    android:layout_height="400dp"
                    android:layout_alignLeft="@+id/txt_question_nu"
                    android:layout_below="@+id/txt_question_nu"
                    android:layout_marginBottom="20dp"
                    android:layout_marginTop="24dp"
                    android:textColor="#000000"
                    android:textSize="20dp" />
    
                <WebView
                    android:id="@+id/questionimage"
                    android:layout_width="wrap_content"
                    android:layout_height="400dp"
                    android:layout_alignLeft="@+id/txt_question_nu"
                    android:layout_alignParentBottom="true"
                    android:layout_below="@+id/txt_question_nu"
                    android:layout_marginTop="24dp"
                    android:fadeScrollbars="false"
                    android:textColor="#000000"
                    android:textSize="20dp"
                    android:textStyle="bold" />
    
                <Button
                    android:id="@+id/hintSolBtn"
                    style="@style/HomeButton"
                    android:layout_width="40dp"
                    android:layout_height="30dp"
                    android:layout_alignParentTop="true"
                    android:layout_toRightOf="@+id/txt_question_nu"
                    android:background="#90b7bb"
                    android:onClick="onClickHintSol"
                    android:scaleType="centerInside"
                    android:text="Hint"
                    android:textColor="#ffffff" />
            </RelativeLayout>
        </LinearLayout>
    
        <RelativeLayout
            android:id="@+id/LinearLayout2"
            android:layout_width="fill_parent"
            android:layout_height="wrap_content"
            android:layout_alignParentBottom="true"
            android:layout_marginTop="15dp"
            android:layout_below="@+id/radio_question_group"
            android:layout_alignParentLeft="true"
            android:orientation="horizontal"
            android:paddingTop="5dip" >
    
            <ImageButton
                android:id="@+id/abandonButton"
                style="@style/HomeButton"
                android:layout_width="wrap_content"
                android:layout_height="50dp"
                android:layout_alignParentRight="true"
                android:layout_marginRight="45dp"
                android:onClick="onAbandonAssess"
                android:paddingLeft="6dp"
                android:scaleType="centerInside"
                android:src="@drawable/abandon"
                android:visibility="gone" />
    
            <Button
                android:id="@+id/submitBtn"
                android:layout_width="150dp"
                android:layout_height="50dp"
                android:layout_alignParentRight="true"
                android:layout_centerVertical="true"
                android:layout_marginRight="63dp"
                android:background="#00b6c6"
                android:onClick="onSubmitAssess"
                android:paddingLeft="6dp"
                android:scaleType="centerInside"
                android:text="Submit"
                android:textColor="#ffffff"
                android:textSize="22dp" />
    
            <ImageButton
                android:id="@+id/prevBtn"
                style="@style/HomeButton"
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:layout_alignParentLeft="true"
                android:layout_weight="0.01"
                android:onClick="onClickPrevQues"
                android:scaleType="centerInside"
                android:src="@drawable/previous" />
    
            <ImageButton
                android:id="@+id/nextBtn"
                style="@style/HomeButton"
                android:layout_width="120dp"
                android:layout_height="wrap_content"
                android:layout_alignParentTop="true"
                android:layout_toRightOf="@+id/prevBtn"
                android:onClick="onClickNextQues"
                android:scaleType="centerInside"
                android:src="@drawable/next" />
        </RelativeLayout>
    
        <TextView
            android:id="@+id/answer_choices"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignParentLeft="true"
            android:layout_below="@+id/LinearLayout1"
            android:layout_marginLeft="37dp"
            android:text="Answer Choices"
            android:textColor="#b4cacc"
            android:textSize="20dp"
            android:textStyle="bold" />
    
        <RadioGroup
            android:id="@+id/radio_question_group"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_alignLeft="@+id/answer_choices"
            android:layout_below="@+id/answer_choices" >
    
            <RadioButton
                android:id="@+id/answer1"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:button="@drawable/radiostate"
                android:checked="false"
                android:layout_marginTop="10dp"
                android:hapticFeedbackEnabled="true"
                android:height="100dp"
                android:textColor="#000000" />
    
            <RadioButton
                android:id="@+id/answer2"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:button="@drawable/radiostate"
                android:layout_marginTop="10dp"
                android:checked="false"
                android:hapticFeedbackEnabled="true"
                android:textColor="#000000" />
    
            <RadioButton
                android:id="@+id/answer3"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:button="@drawable/radiostate"
                android:layout_marginTop="10dp"
                android:checked="false"
                android:hapticFeedbackEnabled="true"
                android:textColor="#000000" />
    
            <RadioButton
                android:id="@+id/answer4"
                android:layout_width="fill_parent"
                android:layout_height="wrap_content"
                android:button="@drawable/radiostate"
                android:layout_marginTop="10dp"
                android:checked="false"
                android:hapticFeedbackEnabled="true"
                android:textColor="#000000" />
        </RadioGroup>
    
        <!-- <ImageView
            android:id="@+id/pen_and_paper_image"
            android:layout_width="wrap_content"
            android:layout_height="wrap_content"
            android:layout_centerHorizontal="true"
            android:layout_centerVertical="true"
            android:src="@drawable/pen_paper"
            android:visibility="gone" /> -->
    
        <ImageButton
            android:id="@+id/erase"
            android:layout_width="35dp"
            android:layout_height="35dp"
            android:layout_above="@+id/radio_question_group"
            android:layout_below="@+id/LinearLayout1"
            android:layout_toRightOf="@+id/answer_choices"
            android:onClick="onEraseChoice"
            android:src="@drawable/eraser"
            android:visibility="visible" />
    
    </RelativeLayout>
    </ScrollView>
    
  • Nicolas
    Nicolas about 7 years
    You should consider adding some explanatin to your answer. even with some code, this is pretty vague.
  • Ast
    Ast about 4 years
    this is the right answer...but you forgot to initialize the downX and upX variables before the onTouch event
  • Ast
    Ast about 4 years
    ... and for a better usability I suggest to add a condition to the value of deltaX before swiping...something like if(Math.abs(deltaX)>0 && Math.abs(deltaX)>150)
  • TheJudge
    TheJudge almost 4 years
    link you provided is down
  • Mojtaba
    Mojtaba almost 4 years
    It can be reached from archive.org. This is the link: web.archive.org/web/20190922193715/http://…