【问题标题】:Android ListView onTouch SwipeAndroid ListView onTouch Swipe
【发布时间】:2015-05-18 13:04:01
【问题描述】:

我正在尝试制作像滑动一样的收件箱以在列表视图中选择多个项目。我可以在主视图下显示一个视图,也可以拖动视图。问题是试图让 onTouch 和 onItemClickListener 一起工作。

1:如果我在 ACTION_DOWN 期间在 switch 案例中返回 true,则 onItemClickListener 将停止工作。如果我返回 false 则我无法拖动视图,但 onItemClickListener 正在工作。

2:在拖动视图时,listView 仍然可以滚动,这使得 onTouch 进​​入 ACTION_CANCEL

我将 onTouchListener 附加到适配器的 getView() 方法中的视图,如下所示:

root.setOnTouchListener(new MySwipeListener);

    @Override
public boolean onTouch(View v, MotionEvent event) {
    switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN: {
            downX = event.getX();
            return false;
        }
        case MotionEvent.ACTION_MOVE: {
            upX = event.getX();
            float deltaX = downX - upX;
            if (Math.abs(deltaX) > MIN_LOCK_DISTANCE && listView != null && !motionInterceptDisallowed) {
                listView.onInterceptTouchEvent(event);
                listView.requestDisallowInterceptTouchEvent(true);
                motionInterceptDisallowed = true;
                listView.requestDisallowInterceptTouchEvent(true);
            }
            if (deltaX > 0) {
                holder.viewLeft.setVisibility(View.GONE);
            } else {
                // if first swiped left and then swiped right
                holder.viewLeft.setVisibility(View.VISIBLE);
            }
            //holder.mainView.setTranslationX(-(int)deltaX);
            if(deltaX < 0) {
                holder.mainView.setTranslationX(-(int) deltaX);
            }
            return true;
        }
        case MotionEvent.ACTION_UP: {
            upX = event.getX();
            float deltaX = upX - downX;
            if (Math.abs(deltaX) > MIN_DISTANCE) {
                holder.mainView.setTranslationX(200);
            } else {
                holder.mainView.setTranslationX(0);
            }
            if (listView != null) {
                listView.requestDisallowInterceptTouchEvent(false);
                motionInterceptDisallowed = false;
            }
            holder.viewLeft.setVisibility(View.VISIBLE);
            return false;
        }
        case MotionEvent.ACTION_CANCEL:{
            holder.viewLeft.setVisibility(View.VISIBLE);
            holder.mainView.setTranslationX(0);
            return false;
        }

    }
    return false;

}

【问题讨论】:

    标签: android


    【解决方案1】:

    请使用 GestureDetector,如下所示,

    private final class GestureListener extends SimpleOnGestureListener {
    
            private static final int SWIPE_THRESHOLD = 100;
            private static final int SWIPE_VELOCITY_THRESHOLD = 120;
    
            @Override
            public boolean onDown(MotionEvent e) {
                setX((int) e.getX());
                setY((int) e.getY());
                return true;
            }
    
            @Override
            public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,
                    float velocityY) {
                boolean result = false;
                try {
                    float diffY = e2.getY() - e1.getY();
                    float diffX = e2.getX() - e1.getX();
                    if (Math.abs(diffX) > Math.abs(diffY)) {
                        if (Math.abs(diffX) > SWIPE_THRESHOLD
                                && Math.abs(velocityX) > SWIPE_VELOCITY_THRESHOLD) {
                            if (diffX > 0) {
                                onSwipeRight();
                            } else {
                                onSwipeLeft();
                            }
                        }
                        result = true;
                    } else if (Math.abs(diffY) > SWIPE_THRESHOLD
                            && Math.abs(velocityY) > SWIPE_VELOCITY_THRESHOLD) {
                        if (diffY > 0) {
                            onSwipeBottom();
                        } else {
                            onSwipeTop();
                        }
                    }
                    result = true;
                } catch (Exception exception) {
                    exception.printStackTrace();
                }
    
                Utils.log("onfling", "val Y:" + velocityY);
                return result;
            }
    
            @Override
            public boolean onDoubleTap(MotionEvent e) {
                // TODO Auto-generated method stub
                if (gestureInterface != null && doubleTap) {
                    gestureInterface.onDoubleTap();
                    return true;
                }
                return false;
            }
    
        }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-11-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多