2012-10-26 16 views
26

Sto avendo un problema che il mio metodoMetodo non onTouchEvent essere chiamato

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    return gestureDetector.onTouchEvent(event); 
} 

è più recente chiamato. Qualche idea perché è così? Sto realizzando un'applicazione api 4.0.3 di google e sto cercando di abilitare i swip per my viewFliper. Tuttavia non può funzionare se il contatto è più recente.

btw:

public class MainActivity extends SherlockMapActivity implements ActionBar.TabListener { 

Ecco la dichiarazione della mia attività. e per rilevare gli swipes ho implementato quello:

SimpleOnGestureListener simpleOnGestureListener = new SimpleOnGestureListener(){ 

    @Override 
    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX,float velocityY) { 

     float sensitvity = 50; 
     if((e1.getX() - e2.getX()) > sensitvity){ 
      SwipeLeft(); 
     }else if((e2.getX() - e1.getX()) > sensitvity){ 
      SwipeRight(); 
     } 

     return true; 
    } 

}; 
GestureDetector gestureDetector= new GestureDetector(simpleOnGestureListener); 

Grazie!

edit:

main.xml:

<?xml version="1.0" encoding="utf-8"?> 
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android" 
android:id="@+id/main_view" 
android:layout_width="fill_parent" 
android:layout_height="fill_parent" 
android:orientation="horizontal" > 

<ViewFlipper 
    android:id="@+id/ViewFlipper" 
    android:layout_width="fill_parent" 
    android:layout_height="wrap_content" 
    android:background="#ffffff" > 

    <include 
     android:layout_height="match_parent" 
     layout="@layout/mymain" /> 

    <include layout="@layout/secondmain" /> 
    <include layout="@layout/thirdmain" /> 
    <include layout="@layout/fourthmain" /> 
</ViewFlipper> 
</LinearLayout> 

EDIT2: tutti i miei layout inclusi hanno ScrollView implementato è mai possibile che di scorrimento si che gli eventi e gestirli. E come rilevare i gesti se è così?

+0

ok, ora sono sicuro che il problema è che la maniglia di scrollview tocca, quindi ad ogni modo ignorarlo e tuttavia essere lo scrollable disponibile? – gabrjan

risposta

40

ho trovato un perfetto soluzione. Ho implementato il nuovo metodo:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 

    View v = getCurrentFocus(); 
    boolean ret = super.dispatchTouchEvent(event); 

e ora tutto funziona correttamente!

Edit:

Il mio codice finale:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    View v = getCurrentFocus(); 
    if (v instanceof EditText) { 
     View w = getCurrentFocus(); 
     int scrcoords[] = new int[2]; 
     w.getLocationOnScreen(scrcoords); 
     float x = event.getRawX() + w.getLeft() - scrcoords[0]; 
     float y = event.getRawY() + w.getTop() - scrcoords[1]; 
     if (event.getAction() == MotionEvent.ACTION_UP 
       && (x < w.getLeft() || x >= w.getRight() || y < w.getTop() || y > w 
         .getBottom())) { 

      InputMethodManager imm = (InputMethodManager) getSystemService(Context.INPUT_METHOD_SERVICE); 
      imm.hideSoftInputFromWindow(getWindow().getCurrentFocus() 
        .getWindowToken(), 0); 
     } 
    } 
    boolean ret = super.dispatchTouchEvent(event); 
    return ret; 
} 
+0

Grazie, questa è una soluzione molto più semplice di quella di @Chaosit. –

+0

Ciao - dove hai implementato questo nuovo metodo? E cosa restituisce? – Jona

+0

Controllare la risposta modificata. Ho quella funzione implementata nel mio file MainActivity.java. O meglio dire nella classe principale dell'app. – gabrjan

1

Tutti i gesti e gli eventi di tocco passano all'elemento più in basso nella gerarchia della vista che può gestirlo. Quindi se hai un listener incluso nel layout puoi chiamare lo ((TypeOfParrent)yourView.getParent()).onTouchEvent(event) per delegare l'evento al gestore che desideri.

AGGIUNGI: Mi raccomando di utilizzare ViewPager per visualizzare le viste. Nel ViewPager non è necessario implementare il proprio onGestureListener.

http://www.edumobile.org/android/android-beginner-tutorials/view-pager-example-in-android-development/

http://developer.android.com/reference/android/support/v4/view/ViewPager.html

5

ok, ora sono sicuro che il problema è che tocca maniglia ScrollView, in modo comunque di ignorare che e tuttavia essere lo scorrimento avaiable?

Sì, questo è il problema, quando Android gestisce gli eventi tocco ogni evento passa da figlio a genitore, quindi prima è gestito da ViewFlipper, ma poi va a ScrollView. Quindi devi implementare getParent(). RequestDisallowInterceptTouchEvent (true) (vedi ViewParent class) per rendere tutti gli eventi touch gestiti da ViewFlipper, e quindi semplicemente rilevare la direzione del gesto se orizzontale, quindi capovolgere la vista se non passare l'evento touch a ScrollView o basta scorrere ScrollView programmazione

EDIT: inoltre è possibile implementare nel vostro OnTouchListener ViewFlipper e in questo trigger ascoltatore GestureDetector.onTouchEvent (evento), ma questo richiede anche requestDisallowInterceptTouchEvent della vostra vista padre è impostata su true

5

Come ho scritto nei commenti di un articolo di Gabrjan che questo spara continuamente mentre toccando lo schermo, c'è in realtà un modo facile per ottenere solo il touch down eventi:

@Override 
public boolean dispatchTouchEvent(MotionEvent event) { 
    if (event.getAction() == MotionEvent.ACTION_DOWN) { 
     System.out.println("TOUCH DOWN!"); 
     //set immersive mode here, or whatever... 
    } 
    return super.dispatchTouchEvent(event); 
} 

questo è stato molto utile per me per mettere l'Android in modalità immersiva ogni qualvolta una qualsiasi parte dello schermo è stato toccato indipendentemente da quale elemento. Ma non volevo impostare ripetutamente la modalità immersiva!

Problemi correlati