Android how to add swipe Gesture on LinearLayout without onDown true

I am working on Gesture activity in android which I used to determine swipe action

public class ActivitySwipeDetector implements View.OnTouchListener { static final String logTag = "ActivitySwipeDetector"; private Activity activity; static final int MIN_DISTANCE = 100; private float downX, downY, upX, upY; public ActivitySwipeDetector(Activity activity){ this.activity = activity; } public void onRightToLeftSwipe(){ Log.i(logTag, "RightToLeftSwipe!"); Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show(); //activity.doSomething(); } public void onLeftToRightSwipe(){ Log.i(logTag, "LeftToRightSwipe!"); Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show(); //activity.doSomething(); } public void onTopToBottomSwipe(){ Log.i(logTag, "onTopToBottomSwipe!"); //Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show(); //activity.doSomething(); } public void onBottomToTopSwipe(){ Log.i(logTag, "onBottomToTopSwipe!"); //Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show(); //activity.doSomething(); } public boolean onTouch(View v, MotionEvent event) { switch(event.getAction()){ case MotionEvent.ACTION_DOWN: { downX = event.getX(); downY = event.getY(); return true; } case MotionEvent.ACTION_UP: { upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; // swipe horizontal? if(Math.abs(deltaX) > MIN_DISTANCE){ // left or right if(deltaX < 0) { this.onLeftToRightSwipe(); return true; } if(deltaX > 0) { this.onRightToLeftSwipe(); return true; } } else { Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE); return false; // We don't consume the event } // swipe vertical? if(Math.abs(deltaY) > MIN_DISTANCE){ // top or down if(deltaY < 0) { this.onTopToBottomSwipe(); return true; } if(deltaY > 0) { this.onBottomToTopSwipe(); return true; } } else { Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long, need at least " + MIN_DISTANCE); return false; // We don't consume the event } return true; } } return false; } } 

my xml file

 <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" xmlns:tools="http://schemas.android.com/tools" android:id="@+id/action_settings" android:layout_width="match_parent" android:layout_height="match_parent" android:paddingBottom="@dimen/activity_vertical_margin" android:paddingLeft="@dimen/activity_horizontal_margin" android:paddingRight="@dimen/activity_horizontal_margin" android:paddingTop="@dimen/activity_vertical_margin" tools:context=".MainActivity" > <TextView android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="@string/hello_world" /> </LinearLayout> 

And in my work I call it

 ActivitySwipeDetector activitySwipeDetector = new ActivitySwipeDetector(this); LinearLayout lowestLayout = (LinearLayout)this.findViewById(R.id.action_settings); lowestLayout.setOnTouchListener(activitySwipeDetector); 

I called ActivitySwipeDetector(this); so that it works fine with full activity. But how can I use the Swipe detector only for LinearLayout, and not for all activity. Please help me.

+6
source share
2 answers

I needed and your code was better, so I fixed it a bit, I need to fix it more, see the comment

 public class RelativeLayoutTouchListener implements OnTouchListener { static final String logTag = "ActivitySwipeDetector"; private Activity activity; static final int MIN_DISTANCE = 100;// TODO change this runtime based on screen resolution. for 1920x1080 is to small the 100 distance private float downX, downY, upX, upY; // private MainActivity mMainActivity; public RelativeLayoutTouchListener(MainActivity mainActivity) { activity = mainActivity; } public void onRightToLeftSwipe() { Log.i(logTag, "RightToLeftSwipe!"); Toast.makeText(activity, "RightToLeftSwipe", Toast.LENGTH_SHORT).show(); // activity.doSomething(); } public void onLeftToRightSwipe() { Log.i(logTag, "LeftToRightSwipe!"); Toast.makeText(activity, "LeftToRightSwipe", Toast.LENGTH_SHORT).show(); // activity.doSomething(); } public void onTopToBottomSwipe() { Log.i(logTag, "onTopToBottomSwipe!"); Toast.makeText(activity, "onTopToBottomSwipe", Toast.LENGTH_SHORT).show(); // activity.doSomething(); } public void onBottomToTopSwipe() { Log.i(logTag, "onBottomToTopSwipe!"); Toast.makeText(activity, "onBottomToTopSwipe", Toast.LENGTH_SHORT).show(); // activity.doSomething(); } public boolean onTouch(View v, MotionEvent event) { switch (event.getAction()) { case MotionEvent.ACTION_DOWN: { downX = event.getX(); downY = event.getY(); return true; } case MotionEvent.ACTION_UP: { upX = event.getX(); upY = event.getY(); float deltaX = downX - upX; float deltaY = downY - upY; // swipe horizontal? if (Math.abs(deltaX) > MIN_DISTANCE) { // left or right if (deltaX < 0) { this.onLeftToRightSwipe(); return true; } if (deltaX > 0) { this.onRightToLeftSwipe(); return true; } } else { Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long horizontally, need at least " + MIN_DISTANCE); // return false; // We don't consume the event } // swipe vertical? if (Math.abs(deltaY) > MIN_DISTANCE) { // top or down if (deltaY < 0) { this.onTopToBottomSwipe(); return true; } if (deltaY > 0) { this.onBottomToTopSwipe(); return true; } } else { Log.i(logTag, "Swipe was only " + Math.abs(deltaX) + " long vertically, need at least " + MIN_DISTANCE); // return false; // We don't consume the event } return false; // no swipe horizontally and no swipe vertically }// case MotionEvent.ACTION_UP: } return false; } } 

Using:

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); rlTop = (RelativeLayout) findViewById(R.id.rlTop); rlTop.setOnTouchListener(new RelativeLayoutTouchListener(this)); } 
+18
source

I had good results with source code. But the listener should be added to the view, not to the layout. In the end, we extend the View.OnTouchListener.

0
source

Source: https://habr.com/ru/post/950438/


All Articles