我试图在列表视图上左右滑动,并将viewflipper设为swtich。就像remeberthemilk应用程序和nexus上的默认新闻和天气应用程序一样(刷新新闻主题)。使用我发现的各种教程,我遇到了一个显示如何实现滑动手势的stackoverflow
class MyGestureDetector extends SimpleOnGestureListener {
@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 true;
// right to left swipe
if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
} else if (e2.getX() - e1.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) {
viewFlipper.setInAnimation(slideRightIn);
viewFlipper.setOutAnimation(slideRightOut);
viewFlipper.showPrevious();
}
} catch (Exception e) {
// nothing
}
return true;
}
}
我做了这个工作
lstView.setOnTouchListener(gestureListener);
然而,有时会发生的事情是当人员滑动时会触发listview setOnItemClickListener。我如何防止这种情况发生,并且只有当用户实际点击它列表项而不只是在其上滑动时才会触发setOnItemClickListener。
谢谢, 费萨尔阿比德
答案 0 :(得分:2)
我找到的一种方法是onItemClick而不是依赖onItem实现
@Override
public boolean onSingleTapConfirmed(MotionEvent e) {
// TODO Auto-generated method stub
Log.e("Item Click", "Item Click");
return super.onSingleTapConfirmed(e);
}
在SimpleOnGestureListener中,似乎它可以正常工作
答案 1 :(得分:1)
这是我使用的方式。这很简单。
将onTouchListener分配给ViewFlipper时,首先为该侦听器创建引用。
public class ViewFlipperTouchListener implements OnTouchListener {
....
......
}
ViewFlipperTouchListener listener = new ViewFlipperTouchListener ();
mViewFlipper.setOnTouchListener(listener);
//now you have reference to listener. use it to send on touch event.
mListView.setOnTouchListener(new OnTouchListener(){
@Override
public boolean onTouch(View v, MotionEvent event){
listener.onTouch(v, event);
return false;
}
});
我只是通过使用引用“listener”将MotionEvent委托给viewflipper的onTouchListener。并返回false以暗示ListView上没有使用该事件。这将帮助您向下/向上列表视图并委派所有内容(向下/向上滚动并向左/向右滑动等等到听众。)..
相信它。它很好用:D
答案 2 :(得分:0)
我认为除了在你的代码中使用你的常量之外,你不能做很多事情,所以如果用户点击或想要刷卡,它可以更好地判断。例如,我在我的代码中使用以下方式(我使用触摸事件,但原则应该类似):
@Override
public boolean onTouch(View view, MotionEvent event) {
switch (event.getAction()) {
case MotionEvent.ACTION_DOWN:
{
downXValue = event.getX();
downTime = event.getEventTime();
break;
}
case MotionEvent.ACTION_UP:
{
float currentX = event.getX();
long currentTime = event.getEventTime();
float difference = Math.abs(downXValue - currentX);
long time = currentTime - downTime;
Log.i("Touch Event:", "Distance: " + difference + "px Time: " + time + "ms");
if ((downXValue < currentX) && (time > 50) && (difference > 50)) {
showPrevious();
}
if ((downXValue > currentX) && (time > 50) && (difference > 50)) {
showNext();
}
break;
}
}
}
如你所见,我在那里放了一个Log输出。所以我只测试了应用程序,每次我试图翻转或点击时,Log告诉我我按了多长时间,差异有多大。所以我在if条件中调整了我的值,直到它在几乎所有情况下都有效