0

I have a gallery with imageviews. I have set a ontouch event on gallery where i can drag the image from gallery and place it some where else. I am able to drag it, but as i am doing it in onTouch event, my gallery dosent scroll hoizontally anymore.Is there anything that can differentiate onTouch and swiping motion? Here is my gallery's OnTouchEvent

 final GestureDetector gdt = new GestureDetector(new GestureListener());

 private static final int SWIPE_MIN_DISTANCE = 150;
 private static final int SWIPE_THRESHOLD_VELOCITY = 100;
 private static final int SWIPE_MAX_OFF_PATH = 100;

 gallery.setOnTouchListener(new OnTouchListener(){

@Override
    public boolean onTouch(View arg1, MotionEvent event) {
            if(gdt.onTouchEvent(event)){
    Log.v(TAG,"gesture detector");
        return true;
    }

    if(event.getAction()==MotionEvent.ACTION_DOWN){

    Gallery parent =(Gallery) arg1;
    int x=(int)event.getX();
    int y=(int) event.getY();
    int position=parent.pointToPosition(x, y);

    ImageView viewDraggedFromGallery=(ImageView)parent.getChildAt(position);
    if(viewDraggedFromGallery.getTag() != null){
    ClipData.Item item=new ClipData.Item((CharSequence)viewDraggedFromGallery.getTag().toString());

    ClipDescription NOTE_STREAM_TYPES= new ClipDescription ((CharSequence)viewDraggedFromGallery.getTag().toString(),new String[ ] {ClipDescription.MIMETYPE_TEXT_PLAIN});
    ClipData clipData=new ClipData(NOTE_STREAM_TYPES,item);
    clipData.addItem(item);
    DragShadowBuilder shadowBuilder=new  View.DragShadowBuilder(viewDraggedFromGallery);
    arg1.startDrag(clipData, shadowBuilder, viewDraggedFromGallery, 0);
    return true;
        }
        else{
            Log.v(TAG,"gallery on touch- Invalid Tag");
            return false;

            }
        }

            return false;
        }

       public boolean dispatchTouchEvent(MotionEvent ev){
    Log.v(TAG,"touch event dispatched"); 
    super.dispatchTouchEvent(ev);
    Log.v(TAG,"gdt.OnTouchEvent(ev) " + gdt.onTouchEvent(ev) );
    return gdt.onTouchEvent(ev);

    }
private class GestureListener extends SimpleOnGestureListener{
    @Override
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float   velocityY) {
        Log.v(TAG,"motion event e1 = " + e1);
        Log.v(TAG,"motion event e2 = " + e2);
        float dX = e2.getX()-e1.getX();

        float dY = e1.getY()-e2.getY();
        if (Math.abs(dY)<SWIPE_MAX_OFF_PATH &&

                Math.abs(velocityX)>=SWIPE_THRESHOLD_VELOCITY &&

                Math.abs(dX)>=SWIPE_MIN_DISTANCE ) {
            return true;
        }

        return false;
    }
}
user1618970
  • 15
  • 2
  • 7

1 Answers1

0

You should build yourself a custom gesture detector which handles both onTouch() and onFling() ("fling" is a synonym for "swipe" in Android).

Take a look at this tutorial

jimpanzer
  • 3,470
  • 4
  • 44
  • 84
MarsAtomic
  • 10,436
  • 5
  • 35
  • 56
  • ok, i followed the tutorial.. and added this in my ontouchlistener if(gdt.onTouchEvent(event)){ Log.v(TAG,"gesture detector"); return true; } but gdt.onTouchEvent(event)) is always returning false. its not going inside OnFling(). Why is it so? – user1618970 Apr 26 '13 at 15:43
  • Post your updated code. I have no idea how you adapted the example to your needs. – MarsAtomic Apr 26 '13 at 21:32
  • have updated my code.i need to cancel the drag when the user just flings the galleryview. – user1618970 Apr 26 '13 at 22:37