android:向左或向右滑动滑动视图
我有一个列表视图。点击某个项目后,该项目的详细视图将打开。这种布局有许多小部件,如文本视图,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;
}
}
我以为新的答案是一个好主意,因为旧的答案是如此不同。
我将从一点背景开始: 这里的想法是使用水平滚动视图以漂亮的方式移动到下一组控件。因此,当用户停止向左或向右滚动滚动视图时,我们想要更改图片和文本,然后将滚动移回中间以准备下一次滑动。有人已经回答了如何在滚动视图停止时收听 我已经包含了一个几乎可行的示例,说明如何使用它来获得所需的效果。
我希望这可以帮助你,并随时问你是否有任何问题。
@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>
谢谢很多的帮助。几个问题:什么是SlowDownThreshold,Hscrollview等谢谢 – png
当用户停止滚动时,他们并不总是将他们的手指从屏幕上移开。这意味着滚动实际上仍然在移动,只是非常缓慢。 SlowDownThreshold是滚动在应用程序考虑滚动完成之前必须移动的速度。 HScroll是水平滚动布局。 HorizontalScrollview Hscroll =(HorizontalScrollview)findViewById(R.id.HorizontalScrollView1)。这样,每次我们想要与水平滚动视图进行交互时,我们不必使用findViewById。 ps对于迟到的2天回答感到抱歉。 – Reefa
非常感谢。这onscrollchanged是哪个类的方法。我没有看到它的活动。应该实现任何接口 – png
如果我理解正确的话,你只需要简单地用手势监听器,然后调用该方法用于填充的所有文本的意见和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来辅助幻灯片。
我终于跟着这个链接:http://misha.beshkin.lv/android-swipe-gesture-implementation/。这正是我所期待的。感谢所有帮助 – png