2015-12-07 11 views
8

Ho una vista a scorrimento con più viste relativelayout orizzontali ... una per ogni record in un database ... che sono create a livello di programmazione.Determina quale VISTA in più viste ha un gesto (doppio clic, scorri a sinistra, scorri verso destra, ecc.)?

Ho bisogno di determinare quale vista è influenzata da alcuni gesti ... fare clic, doppio clic e scorrimento sinistro/destro.

Naturalmente il CLICCA sono stato in grado di ottenere con:

 RelativeLayout rlView = new RelativeLayout(this); 
    rlView.setId(10000+myrecordid); 
    rlView.setOnClickListener(myviewclick); 

e la myviewclick:

private View.OnClickListener myviewclick = new View.OnClickListener() { 
    public void onClick(View v) { 
     Integer i=v.getId()-10000; 
     // Do some processing on this view 
    } 
}; 

Da quello che ho trovato in rete, ho cercato di ottenere il gesto in questo modo:

rlView.setOnTouchListener(myviewtouch); 

con questo codice:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public boolean onTouch(View v, MotionEvent event) { 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Log.i("MYLOG","double tap"); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Log.i("MYLOG","SingleTapConfirmed"); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Log.i("MYLOG","LongPress"); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right"); 
      else 
       Log.i("MYLOG","Fling Left"); 
      return true; 
     } 
    }); 
}; 

Secondo MYLOG, sto ricevendo i gesti appropriati secondo le necessità. Il problema è che non so come ottenere l'ID della vista in cui si trovava il gesto. So che è nello onTouch ma che ha chiamato lo gestureDetector.OnTouchEvent per determinare il movimento ... e sono perso a questo punto.

Ho cercato dappertutto StackOverflow e altri siti per diverse ore ... mostrano tutti le differenze su come determinare il gesto ... ma non riesco a trovare nulla sull'utilizzo con più viste che posso usare.

Qualsiasi aiuto sarebbe apprezzato.

+0

Spiego il contesto per il motivo per cui aggiungo la taglia in [questa domanda] (https://stackoverflow.com/questions/45070129/detecting-common-gestures-on-multiple-views-in-android). – Suragch

risposta

5

Penso di aver capito. Probabilmente non è il modo più elegante per farlo, e potrebbero esserci altri "problemi" a causa della sua gestione in questo modo, ma per ora funziona. Ma se gli altri trovano questo problema, ecco come ho lavorato attorno ad esso:

Ecco come è stato elaborato il mio codice modificato. Ho aggiunto una variabile pubblica denominata vTouch:

private View.OnTouchListener myviewtouch = new View.OnTouchListener(){ 
    public View vTouch; 
    public boolean onTouch(View v, MotionEvent event) { 
     vTouch=v; 
     return gestureDetector.onTouchEvent(event); 
    } 

    GestureDetector gestureDetector = new GestureDetector(new GestureDetector.SimpleOnGestureListener() { 
     @Override 
     public boolean onDoubleTap(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","double tap in view: "+viewId); 
      return true; 
     } 
     @Override 
     public boolean onSingleTapConfirmed(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","SingleTapConfirmed in view: "+viewId); 
      return true; 
     } 
     @Override 
     public void onLongPress(MotionEvent e) { 
      Integer viewId=vTouch.getId(); 
      Log.i("MYLOG","LongPress in view: "+viewId); 
     } 

     public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
      Integer viewId=vTouch.getId(); 
      if (e1.getX()<e2.getX()) 
       Log.i("MYLOG","Fling Right in view: "+viewId); 
      else 
       Log.i("MYLOG","Fling Left in view: "+viewId); 
      return true; 
     } 
    }); 
}; 

Usando la variabile pubblica interna vTouch ora posso riferire la vista all'interno di ciascun evento gesto dove mai è necessaria la "vista" che il gesto si trovava a

.
+0

grazie per quello. è difficile credere che sia così difficile rilevare uno sfioramento in Android! – Fattie

+0

['GestureDetector (GestureDetector.OnGestureListener listener)': Questo costruttore è stato dichiarato obsoleto in livello API 3. Utilizzare 'GestureDetector (android.content.Context, android.view.GestureDetector.OnGestureListener)' invece.] (Https: // developer. android.com/reference/android/view/GestureDetector.html#GestureDetector(android.view.GestureDetector.OnGestureListener)) – Suragch

+0

Test su più visualizzazioni, 'onLongPress' sparava per ogni evento (dopo una pausa). Come [questa domanda] (https://stackoverflow.com/q/24326530/3681880). Avevo bisogno di sovrascrivere 'onDraw' e restituire' true' per far funzionare tutto. – Suragch

Problemi correlati