Android: swipe left or right to view slides

I have a list. When you click an item, a detailed view of the item opens. There are many widgets in this layout, such as text view, ImageView Buttons , etc. Now I want to move this detail view of the items to display a detailed view of the next item in the list. Similarly, the previous item is from left to right.

I can not implement moving view. I did how to get previous / next items in a list. But the actual glide is the problem

I tried gesturedetector, as in Android: swipe left and right and left on the screen

and some other examples. But when I try to slide, there is no effect. I do not see any visual glide at all.

How to fix it?

Tried this code but still not running the slide

  public class ProductActivity extends Activity implements OnGestureListener { @ Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.product_details); setContent(); } private void setContent() { Bundle extras = getIntent().getExtras(); TextView title = (TextView) findViewById(R.id.title); title.setText(extras.getString("Title")); TextView desc = (TextView) findViewById(R.id.desc); desc.setText(extras.getString("Desc")); Button buy = (Button) findViewById(R.id.buy); String priceTag = ("$" + String.format("%.2g", extras.getDouble("Price")) + " Buy Now >>"); buy.setText(priceTag); ImageView image = (ImageView) findViewById(R.id.productimage); Utils.imageLoader.DisplayImage(extras.getString("Image"), image); } private static final int SWIPE_MIN_DISTANCE = 6; // 120; private static final int SWIPE_MAX_OFF_PATH = 125; // 250; private static final int SWIPE_THRESHOLD_VELOCITY = 100; // 200; private GestureDetector gestureScanner; @ Override public boolean onTouchEvent(MotionEvent me) { return gestureScanner.onTouchEvent(me); } // @Override public boolean onDown(MotionEvent e) { // viewA.setText("-" + "DOWN" + "-"); return true; } // @Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show(); } else if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Swipe up", Toast.LENGTH_SHORT).show(); } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Swipe down", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // nothing } return true; } @ Override public void onLongPress(MotionEvent e) { Toast mToast = Toast.makeText(getApplicationContext(), "Long Press", Toast.LENGTH_SHORT); mToast.show(); } // @Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { // viewA.setText("-" + "SCROLL" + "-"); return true; } // @Override public void onShowPress(MotionEvent e) { // viewA.setText("-" + "SHOW PRESS" + "-"); } // @Override public boolean onSingleTapUp(MotionEvent e) { Toast mToast = Toast.makeText(getApplicationContext(), "Single Tap", Toast.LENGTH_SHORT); mToast.show(); return true; } } 
+4
source share
2 answers

I thought a new answer would be a good idea, since the old one is so different.

I'll start with a little background: The idea here is to use the horizontal scroll view to go to the next set of controls. Therefore, when the user stops scrolling the scroll view left or right, we want to change the images and text, and then move the scroll back to the middle in preparation for the next scroll. Someone already answered how to listen when the scroll view stops. I have included an almost working example of how you can use this to get the effect you are looking for.

I hope this helps and feel free to ask if you have more problems.

  @Override protected void onScrollChanged(int x, int y, int oldX, int oldY) { if (Math.abs(y - oldY) > SlowDownThreshold) { currentlyScrolling = true; } else { currentlyScrolling = false; if (!currentlyTouching) { //scrolling stopped...handle here //Check if it was a left or right swipe by comparing the new and old scroll locations if (y > oldY) { //Scroll moved Right //So we would do something like setContents(Index + 1); //We find out where the middle of the scroll is int middleHScroll = (Hscrollview.getMeasuredWidth() / 2) - (Hscrollview.getMeasuredWidth() / 2) //We then return the scroll view to the middle HScroll.scrollTo(middleHScroll); } else { //Scroll moved Left //We get set the pictures and text to the previous Index of the contents setContents(Index - 1); //We find out where the middle of the scroll is int middleHScroll = (Hscrollview.getMeasuredWidth() / 2) - (Hscrollview.getMeasuredWidth() / 2) //We then return the scroll view to the middle HScroll.scrollTo(middleHScroll); } super.onScrollChanged(x, y, oldX, oldY); } } } 

xml should be something like these lines. There is still a lot of work to do this, but I hope this puts you in the right direction.

  <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" > <TextView android:id="@+id/textview1" android:layout_width="fill_parent" android:layout_height="wrap_content" android:background="@drawable/title_bar" android:gravity="center_horizontal" android:text="PRODUCTS >> PRODUCT DETAILS" /> <RelativeLayout android:layout_width="fill_parent" android:layout_height="wrap_content" > <RelativeLayout android:id="@+id/RelativeLayout1" android:layout_width="fill_parent" android:layout_height="fill_parent" android:orientation="vertical" android:weightSum="2" > <HorizontalScrollView xmlns:android="http://schemas.android.com/apk/res/android" android:id="@+id/HorizontalScrollView1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_alignParentLeft="true" android:layout_alignParentTop="true" > <LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginRight="70dp" android:orientation="horizontal" > <ImageView android:id="@+id/productimage3" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="70dp" android:layout_marginRight="20dp" android:layout_weight="1" android:background="@drawable/product_detail_gradient" android:minHeight="100dp" android:minWidth="100dp" /> <ImageView android:id="@+id/productimage2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" android:layout_weight="1" android:background="@drawable/product_detail_gradient" android:minHeight="100dp" android:minWidth="100dp" /> <ImageView android:id="@+id/productimage1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:layout_marginLeft="70dp" android:layout_marginRight="70dp" android:layout_weight="1" android:background="@drawable/product_detail_gradient" android:minHeight="100dp" android:minWidth="100dp" /> </LinearLayout> </HorizontalScrollView> <RelativeLayout android:id="@+id/description" android:layout_width="fill_parent" android:layout_height="fill_parent" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:layout_below="@+id/HorizontalScrollView1" android:layout_weight="1" android:background="@drawable/black_img_bg" > <TextView android:id="@+id/title" android:layout_width="wrap_content" android:layout_height="wrap_content" android:textSize="15dip" android:textStyle="bold" > </TextView> <TextView android:id="@+id/desc" android:layout_width="fill_parent" android:layout_height="wrap_content" android:layout_below="@+id/title" > </TextView> <Button android:id="@+id/addtocart" android:layout_width="80dip" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentLeft="true" android:background="@drawable/button_green_lhs" android:gravity="left|center_vertical" android:onClick="addToCartOrBuy" android:text="Add To Cart" android:textSize="10dip" /> <Button android:id="@+id/buy" android:layout_width="150dip" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_toRightOf="@+id/addtocart" android:background="@drawable/button_orange_mid" android:onClick="addToCartOrBuy" android:text="Buy" android:textSize="10dip" /> <Button android:id="@+id/tellafriend" android:layout_width="80dip" android:layout_height="wrap_content" android:layout_alignParentBottom="true" android:layout_alignParentRight="true" android:layout_toRightOf="@+id/buy" android:background="@drawable/button_green_rhs" android:gravity="right|center_vertical" android:onClick="tellAFriend" android:text="Tell A Friend" android:textSize="10dip" /> </RelativeLayout> </RelativeLayout> </RelativeLayout> </LinearLayout> 
+2
source

If you understand correctly, you just need to use a gesture listener, and then call the method that you use to populate all the textual representations and images that you have with the following copy of the information.

I found this example very useful when I found out about gesture recognition.

First add a gesture listener to your public myClass class

 import android.widget.Toast; public class myClass extends Activity implements OnGestureListener { 

Then immediately follows the following so that we can listen for each touch event.

  private static final int SWIPE_MIN_DISTANCE = 6; //120; private static final int SWIPE_MAX_OFF_PATH = 125; //250; private static final int SWIPE_THRESHOLD_VELOCITY = 100; //200; private GestureDetector gestureScanner;@ Override public boolean onTouchEvent(MotionEvent me) { return gestureScanner.onTouchEvent(me); } //@Override public boolean onDown(MotionEvent e) { //viewA.setText("-" + "DOWN" + "-"); return true; } //@Override public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { try { if (Math.abs(e1.getY() - e2.getY()) > SWIPE_MAX_OFF_PATH) return false; // right to left swipe if (e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Left Swipe", Toast.LENGTH_SHORT).show(); } else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Right Swipe", Toast.LENGTH_SHORT).show(); } else if (e1.getY() - e2.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Swipe up", Toast.LENGTH_SHORT).show(); } else if (e2.getY() - e1.getY() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { Toast.makeText(getApplicationContext(), "Swipe down", Toast.LENGTH_SHORT).show(); } } catch (Exception e) { // nothing } return true; }@ Override public void onLongPress(MotionEvent e) { Toast mToast = Toast.makeText(getApplicationContext(), "Long Press", Toast.LENGTH_SHORT); mToast.show(); } //@Override public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { //viewA.setText("-" + "SCROLL" + "-"); return true; } //@Override public void onShowPress(MotionEvent e) { //viewA.setText("-" + "SHOW PRESS" + "-"); } //@Override public boolean onSingleTapUp(MotionEvent e) { Toast mToast = Toast.makeText(getApplicationContext(), "Single Tap", Toast.LENGTH_SHORT); mToast.show(); return true; } 

You can use the methods used to call the previous or next instance inside the corresponding listener where the toast is located.

You can adjust the sensitivity of the fingers by changing these variables.

  private static final int SWIPE_MIN_DISTANCE = 6; //120; private static final int SWIPE_MAX_OFF_PATH = 125; //250; private static final int SWIPE_THRESHOLD_VELOCITY = 100; //200; 

Hope this helps.

Edit:

Sorry for the confusion, your onCreate should include gestureScanner = new GestureDetector (this);

 @Override protected void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.product_details); setContent(); gestureScanner = new GestureDetector(this); } 

This should make it work, except for the visual effect. You can experiment using ScrollView to help with the slide.

+1
source

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


All Articles