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;
}
});
Comments
-
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 theLinearlayout
insideScrollView
. 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 about 7 yearsYou should consider adding some explanatin to your answer. even with some code, this is pretty vague.
-
Ast about 4 yearsthis is the right answer...but you forgot to initialize the downX and upX variables before the onTouch event
-
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 almost 4 yearslink you provided is down
-
Mojtaba almost 4 yearsIt can be reached from archive.org. This is the link: web.archive.org/web/20190922193715/http://…