6

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> 
4
  • ScrollView taking the touch event and not the linear layout...better use listview insted Commented Apr 22, 2013 at 7:16
  • @Akilan I've a bunch of stuffs inside the LinearLayout, that cannot fit together in the ListView. ScrollView is the only way Commented Apr 22, 2013 at 7:18
  • can u post the screen shot of linearLayout Commented Apr 22, 2013 at 7:21
  • @Akilan edited question to add layout Commented Apr 22, 2013 at 8:54

3 Answers 3

8

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(); break; } 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; } } break; } } return false; } }); 
Sign up to request clarification or add additional context in comments.

2 Comments

this is the right answer...but you forgot to initialize the downX and upX variables before the onTouch event
... 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)
6

I think this is what you are looking for:

Swipe event in android ScrollView

2 Comments

link you provided is down
It can be reached from archive.org. This is the link: web.archive.org/web/20190922193715/http://…
0
mSlop = ViewConfiguration.get(getActivity()).getScaledTouchSlop(); boolean mIsSwiping = false; public boolean onTouch(View v, MotionEvent event) { //Timber.d("onTouch, v.getId %d, event.getActionMasked %d", v.getId(), event.getActionMasked()); switch (event.getActionMasked()) { case MotionEvent.ACTION_DOWN: mDownX = event.getX(); mDownY = event.getY(); break; case MotionEvent.ACTION_UP: case MotionEvent.ACTION_CANCEL: mIsSwiping = false; break; case MotionEvent.ACTION_MOVE: float deltaX = event.getX() - mDownX; float deltaY = event.getY() - mDownY; if (!mIsSwiping && Math.abs(deltaX) > mSlop && Math.abs(deltaY) < mSlop) { mIsSwiping = true; if (deltaX > 0) { Timber.d("swipe from left to right, slop %d", mSlop); // TODO: } else { Timber.d("swipe from right to left"); // TODO: } return true; } else if (!mIsSwiping && Math.abs(deltaY) > mSlop) { mIsSwiping = true; Timber.d("swipe vertical"); return true; } } return false; } 

1 Comment

You should consider adding some explanatin to your answer. even with some code, this is pretty vague.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.