S L
S L

Reputation: 429

Drag and drop in ScrollView

I have some ImageViews inside a HorizontalScrollView.

I would like to be able to drag and drop the ImageViews somewhere else, but still maintain scrolling capability. Dragging should only be activated when the user starts a mostly vertical motion with their finger.

For now, I have drag and drop activate on long-press, but that is not a good solution.

To illustrate: Drag and Drop

Upvotes: 3

Views: 3124

Answers (1)

lddias
lddias

Reputation: 166

I had to do exactly this as well. After reading http://techin-android.blogspot.in/2011/11/swipe-event-in-android-scrollview.html I adapted the code as follows:

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

And then set the listener on the ImageViews:

            imageView.setOnTouchListener(new MyOnTouchListener());

In this version of the code I am only checking for movement in the vertical direction (I also changed the minimum movement to be 40 instead of 100 as in the original code). If a vertical movement is detected, the specific ImageView can begin to drag or do any other actions you want. If a vertical movement is not detected, the ImageView's MyTouchListener returns false which means the ImageView does not consume the touch event. This allows the parent ScrollView to eventually get the touch event and consume it (for scroll detection). The answers here are helpful for understanding touch events: MotionEvent handling in ScrollView in Android.

Upvotes: 2

Related Questions