2012-10-19 154 views
4

我有一个列表视图。点击某个项目后,该项目的详细视图将打开。这种布局有许多小部件,如文本视图,ImageView Buttons等。现在我想滑动这些项目的详细视图来显示列表中下一项的详细视图。同样以前的项目为从左到右。android:向左或向右滑动滑动视图

我不能实现视图滑动我已经完成了如何获得列表中的前/后项目。但实际的滑动是问题

我试图gesturedetector像Android: Swipe left to right and right to left

和其他一些例子。但是当我尝试滑动时,没有任何效果。我没有看到任何视觉滑动。

如何解决这个问题?

尝试这种代码,但仍然没有滑动发生

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; 
    } 

} 
+0

我终于跟着这个链接:http://misha.beshkin.lv/android-swipe-gesture-implementation/。这正是我所期待的。感谢所有帮助 – png

回答

2

我以为新的答案是一个好主意,因为旧的答案是如此不同。

我将从一点背景开始: 这里的想法是使用水平滚动视图以漂亮的方式移动到下一组控件。因此,当用户停止向左或向右滚动滚动视图时,我们想要更改图片和文本,然后将滚动移回中间以准备下一次滑动。有人已经回答了如何在滚动视图停止时收听 我已经包含了一个几乎可行的示例,说明如何使用它来获得所需的效果。

我希望这可以帮助你,并随时问你是否有任何问题。

@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应该是沿着这些线的东西。要做到这一点还有很多工作要做,但我希望这能让你走向正确的方向。

<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> 
+0

谢谢很多的帮助。几个问题:什么是SlowDownThreshold,Hscrollview等谢谢 – png

+0

当用户停止滚动时,他们并不总是将他们的手指从屏幕上移开。这意味着滚动实际上仍然在移动,只是非常缓慢。 SlowDownThreshold是滚动在应用程序考虑滚动完成之前必须移动的速度。 HScroll是水平滚动布局。 Horizo​​ntalScrollview Hscroll =(Horizo​​ntalScrollview)findViewById(R.id.Horizo​​ntalScrollView1)。这样,每次我们想要与水平滚动视图进行交互时,我们不必使用findViewById。 ps对于迟到的2天回答感到抱歉。 – Reefa

+0

非常感谢。这onscrollchanged是哪个类的方法。我没有看到它的活动。应该实现任何接口 – png

1

如果我理解正确的话,你只需要简单地用手势监听器,然后调用该方法用于填充的所有文本的意见和imageviews你有下一个信息实例。

我发现这个例子在我学习手势识别时非常有用。

首先手势监听器添加到您的公共MyClass类

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

然后将下面的顺利,之后,使我们可以听 每个触摸事件。

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; 
    } 

你可以把你用它来调用相关的监听器哪里敬酒是内上一个或下一个实例的方法。

你可以通过改变这些变量

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; 

我希望这有助于走出调整挥笔的sensotivity。

编辑:

对不起,混合起来,你的onCreate应包括gestureScanner =新GestureDetector(本);

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

这应该让它工作,除了视觉效果。您可以尝试使用ScrollView来辅助幻灯片。

+0

我建议使用滚动视图。设置3组图像和文本控件。然后,当用户滚动到滚动视图的顶部时,设置新元素并将其滚动到中间。让滚动视图执行艰苦的工作,并允许图像和文本视图的无缝重绘。 – Reefa

+0

我试过了。请参阅我的更新。但我没有看到不能滑动的效果,也没有烤面包来了。我想我缺少一些基本的东西。 – png

+0

我编辑了我的答案,让你的听众开始工作。 – Reefa