在ScrollView中拖放

时间:2014-02-05 23:00:37

标签: android drag-and-drop scrollview

我在Horizo​​ntalScrollView中有一些ImageView。

我希望能够将ImageViews拖放到其他地方,但仍然保持滚动功能。只有当用户用手指开始大部分垂直运动时才能激活拖动。

目前,我在长按时拖放了激活,但这不是一个好的解决方案。

说明: Drag and Drop

1 个答案:

答案 0 :(得分:2)

我也必须做到这一点。阅读http://techin-android.blogspot.in/2011/11/swipe-event-in-android-scrollview.html后,我按如下方式修改了代码:

class MyOnTouchListener implements View.OnTouchListener {
    static final int MIN_DISTANCE_Y = 40;

    private float downY, upY;

    @Override
    public boolean onTouch(View view, MotionEvent event) {
        switch (event.getAction()) {
            case MotionEvent.ACTION_DOWN: {
                downY = event.getY();
                return true;
            }
            case MotionEvent.ACTION_MOVE: {
                upY = event.getY();

                float deltaY = downY - upY;

                // swipe vertical?
                if (Math.abs(deltaY) > MIN_DISTANCE_Y) {
                    if (deltaY < 0) {
                        //Start your drag here if appropriate
                        return true;
                    }
                    if (deltaY > 0) {
                        //Or start your drag here if appropriate
                        return true;
                    }
                }
            }
        }
        return false;
    }
}

然后在ImageView s:

上设置监听器
            imageView.setOnTouchListener(new MyOnTouchListener());

在这个版本的代码中,我只检查垂直方向的移动(我还将最小移动更改为40而不是原始代码中的100)。如果检测到垂直移动,则特定ImageView可以开始拖动或执行您想要的任何其他操作。如果未检测到垂直移动,则ImageView的{​​{1}}会返回MyTouchListener,这意味着false不会消耗触摸事件。这允许父ImageView最终获得触摸事件并使用它(用于滚动检测)。这里的答案有助于理解触摸事件:MotionEvent handling in ScrollView in Android