2011-02-10 12 views
7

Sto implementando un MyGestureDetector che estende SimpleOnGestureListener. Ho preso in prestito la classe da: http://www.codeshogun.com/blog/tag/view-flipper/ per consentire un'azione di scorrimento in un ViewFlipper. Non riesco a capire se funziona sull'emulatore. Eventuali suggerimenti?MyGestureDetector estende SimpleOnGestureListener

Qui di seguito è tutto il codice:

Il main.java

import android.app.Activity; 
import android.os.Bundle; 
import android.view.GestureDetector; 
import android.view.KeyEvent; 
import android.view.MotionEvent;import android.view.View; 
import android.view.GestureDetector.SimpleOnGestureListener; 
import android.view.animation.Animation; 
import android.view.animation.AnimationUtils; 
import android.webkit.WebView; 
import android.widget.ViewFlipper; 


public class main extends Activity { 

private static final int SWIPE_MIN_DISTANCE = 120; 
private static final int SWIPE_MAX_OFF_PATH = 250; 
private static final int SWIPE_THRESHOLD_VELOCITY = 200; 
private GestureDetector gestureDetector; 
View.OnTouchListener gestureListener; 
private Animation slideLeftIn; 
private Animation slideLeftOut; 
private Animation slideRightIn; 
private Animation slideRightOut; 
private ViewFlipper viewFlipper; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
    super.onCreate(savedInstanceState); 
    setContentView(R.layout.main); 

    // ---------------------------------Sets Swipe Animation to Next View -->  
    viewFlipper = (ViewFlipper)findViewById(R.id.AC4313); 
    slideLeftIn = AnimationUtils.loadAnimation(this, R.anim.slide_left_in); 
    slideLeftOut = AnimationUtils.loadAnimation(this, R.anim.slide_left_out); 
    slideRightIn = AnimationUtils.loadAnimation(this, R.anim.slide_right_in); 
    slideRightOut = AnimationUtils.loadAnimation(this, R.anim.slide_right_out); 

    gestureDetector = new GestureDetector(new MyGestureDetector()); 
    gestureListener = new View.OnTouchListener() { 
     public boolean onTouch(View v, MotionEvent event) { 
      if (gestureDetector.onTouchEvent(event)) { 
       return true; 
      } 
      return false; 
     } 
    };  
} 

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 false; 
      // right to left swipe 
      if(e1.getX() - e2.getX() > SWIPE_MIN_DISTANCE && Math.abs(velocityX) > SWIPE_THRESHOLD_VELOCITY) { 
       viewFlipper.setInAnimation(slideLeftIn); 
       viewFlipper.setOutAnimation(slideLeftOut); 
       viewFlipper.showNext(); 
      } 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 false; 
    } 
}  

@Override // ------------------------------ Catch the Gesture Event by Overriding onTouch() method: --> 
public boolean onTouchEvent(MotionEvent event) { 
    if (gestureDetector.onTouchEvent(event)) 
     return true; 
    else 
     return false; 
} 

L'anim * del .xml:

<?xml version="1.0" encoding="utf-8"?> 

<set xmlns:android="http://schemas.android.com/apk/res/android"> 
    <translate android:fromXDelta="100%p" android:toXDelta="0" android:duration="800"/> 
</set> 
+2

Qual è il comportamento? –

+0

FWIW, ho già implementato un 'ViewFlipper' con il supporto di scorrimento tramite un' GestureDetector': https://github.com/commonsguy/cwac-viewswiper – CommonsWare

+0

Hai provato su un dispositivo? Non sono sicuro che l'emulatore possa gestire le fiammate. Questo codice sembra identico a quello che uso e ho basato il mio sullo stesso sito web che hai collegato. Funziona per me su dispositivi reali, ma non l'ho mai testato su un emulatore. – FoamyGuy

risposta

11

Credo che il problema è che non ignorare l'evento OnDown. Aggiungi questo snippet di codice alla tua classe MyGestureDetector e dovrebbe funzionare.

@Override 
public boolean onDown(MotionEvent e) { 
    return true;   
} 

L'evento onDown restituire false per impostazione predefinita, e iniziare ogni gesto con onDown così il vostro evento onFling non scatta mai.

Istvan

2

Sembra che ora è possibile risolvere questo problema con molto meno codice utilizzando un rivelatore gesto, in questo modo:

import android.content.Context; 
import android.util.AttributeSet; 
import android.view.GestureDetector; 
import android.view.MotionEvent; 
import android.view.View; 
import android.widget.GridView; 

public class ScrollingGridView extends GridView { 
    private GestureDetector gestureDetector; 

    public ScrollingGridView(Context context, AttributeSet attrs) { 
     this(context, attrs, 0); 
    } 

    public ScrollingGridView(Context context, AttributeSet attrs, int defStyle) { 
     super(context, attrs, defStyle); 
     setupGestureListener(); 
    } 

    private void setupGestureListener() { 
     GestureDetector.SimpleOnGestureListener gestureListener = new GestureDetector.SimpleOnGestureListener() { 
      @Override 
      public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
       scrollBy((int)distanceX, (int)distanceY); 
       return true; 
      } 
     }; 
     gestureDetector = new GestureDetector(getContext(), gestureListener); 
     setOnTouchListener(new OnTouchListener() { 
      @Override 
      public boolean onTouch(View view, MotionEvent motionEvent) { 
       gestureDetector.onTouchEvent(motionEvent); 
       return true; 
      } 
     }); 
    } 
}