Autore Topic: Swipe in quattro direzioni  (Letto 1624 volte)

Offline MisterHide

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Swipe in quattro direzioni
« il: 13 Febbraio 2013, 18:20:54 CET »
0
Ciao a tutti. E' da poco che programmo in Android e sono riuscito a risolvere da solo (cioè cercando in rete e soprattutto su questo forum) i vari problemi che mi si sono proposti man mano.
Ma questa volta non so nemmeno da dove iniziare. (forse mi hanno dato un compito troppo difficile)
Devo realizzare una gallery particolare, cioè immaginate di avere un elenco di ristoranti e ogni ristorante ha la sua scheda descrittiva e la sua galleria di immagini.
Quello che mi hanno chiesto di fare è di visualizzare la foto (a tutto schermo) del 1° ristorante.
Poi in base alla direzione dello swipe (si dice così spero) deve succedere:
1- se è da Dx verso Sx mi deve visualizzare la foto successiva del ristorante.
2- se è da Sx verso Dx mi deve visualizzare le scheda descrittiva del ristorante.
3- se è verticale mi passa al ristorante successivo ( o precedente)
??? Da dove devo iniziare? cosa mi consigliate di consultare? Lascio stare e cambio lavoro?
Vi prego aiutatemi.

Offline blastor

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Swipe in quattro direzioni
« Risposta #1 il: 22 Febbraio 2013, 14:25:08 CET »
0
sto studiando da poco questo linguaggio e sarei interessato anche io a un lavoro del genere...
Per ora per quel che mi è venuto in mente, non conoscendo nessun evento specifico per lo swype(magari esiste ma non ho trovato iente su internet) è di gestire il tocco del touch e il rilascio del touch e andare a controllare le coordinate così da sapere in che direzione è stato fatto lo swype...

P.S. comunque credo ci sia un evento che gestisca meglio il tutto, ma fin ora non ho trovato niente...se trovi qualcosa potresti informarmi?

Io intanto questo pomeriggio proverò a fare qualcosa seguendo il metodo che ho citato, ripeto che è il miglior approccio che mi è venuto in testa, quindi non so se e quanto sia utile e funzionante...penso solo che "logicamente" la cosa sia fattibile, "praticamente" non so

Offline MisterHide

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Swipe in quattro direzioni
« Risposta #2 il: 22 Febbraio 2013, 15:08:20 CET »
0
Per ora sto cercando di risolvere con la Gallery.
Si lo so che è deprecata, ma ho provato sia con viewpage che con ScrollView combinato ad un horizontalscrollview e mi è venuto fuori un casino, almeno con la gallery sono riuscito ad intercettare gli eventi.
L'unico problema è che per fare anche lo scroll verticale l'ho dovuto simulare con delle animazioni (per la verità ci sto ancora provando).
Se riesci a trovare un'altra soluzione fammelo sapere, io appena risolvo con questo metodo vedo di postare un po di codice.
Ciao a presto (almeno spero) :-)

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Swipe in quattro direzioni
« Risposta #3 il: 22 Febbraio 2013, 15:18:19 CET »
0
Dipende da come vuoi che sia l'effetto.

Il metodo di blastor, seppur logicamente corretto, te lo sconsiglio perchè secondo me è poco "responsivo".

Io posso spostare il dito 50 volte ma se finisco nello stesso punto in cui ho iniziato non ottengo alcun effetto.
Tra l'altro secondo me diventa di difficile interpretazione da parte dell'utente se a fronte di uno swipe pesante non succede niente fino a quando non sollevo il dito.

Io userei l'ontouchlistener ( View.OnTouchListener | Android Developers ) e farei una cosa di questo tipo:

Codice (Java): [Seleziona]
public boolean onTouch(View v, MotionEvent event) {
// Se siamo in mezzo a una gesture...
 if((event.getAction() & MotionEvent.ACTION_MASK) == MotionEvent.ACTION_MOVE){
// Se è la prima volta che ci muoviamo...
if( m_bIsMoving == false ){
// Inizializza il punto iniziale
m_nFirstTouchPosX = (int)event.getX();
m_nFirstTouchPosY = (int)event.getY();
}
// Indica che ci stiamo muovendo e salviamo l'ultima posizione
m_bIsMoving = true;
m_nLastTouchPosX = (int)event.getX();
m_nLastTouchPosY = (int)event.getY();
// Volendo fai qualcosa per gestire questo movimento mentre avviene, come per indicare che l'app supporta lo swipe...
doSomething();
return true;
}
// Siamo fuori quindi probabilmente il gesto è un up o down. Se è un down prima non ci stavamo muovendo quindi l'if viene saltato.
// Se è un up ci stavamo muovendo e l'utente ha tolto il dito
if( m_bIsMoving == true ){
// A questo punto tu hai i first che ti indicano l'inizio del gesto e i last che ti indicano l'ultima posizione.
doSomething2();
}
// A prescindere dall'evento non ci stiamo muovendo...
m_bIsMoving = false;
return true;
}

Se non chiami doSomething fai praticamente quello che dice blastor.  ;-)

Offline blastor

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Swipe in quattro direzioni
« Risposta #4 il: 22 Febbraio 2013, 16:11:16 CET »
0
mentre scrivevo pensavo proprio alla gestione di quel che hai detto tu: in parole povere il codice che hai scritto tu permette anche di far qualcosa mentre il dito si sta spostando giusto?
un esempio potrebbe essere la gallery che si va spostando piano piano mentre sposto il dito, esatto?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Swipe in quattro direzioni
« Risposta #5 il: 22 Febbraio 2013, 16:16:01 CET »
0
Esatto, quando chiami doSomething() hai in m_nFirstTouchPosX e m_nFirstTouchPosY la coordinata iniziale e in m_nLastTouchPosX e m_nLastTouchPosY la coordinata corrente.

In questo modo puoi provare a fare qualcosa mentre l'utente fa lo swipe.

Per esempio calcoli il valore assoluto della differenza tra last e first per i due assi e vedi quale è maggiore.
Una volta identificato l'asse maggiore ricalcoli la differenza su quell'asse e sai verso quale direzione l'utente "sta andando".

 ;-)

Offline MisterHide

  • Utente junior
  • **
  • Post: 65
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Windows XP
Re:Swipe in quattro direzioni
« Risposta #6 il: 22 Febbraio 2013, 18:03:39 CET »
0
Hai ragione undead, non me ne ero ancora accorto. o_O
Proverò anche la tua soluzione. (lunedì, ormai è gia week-end :-)
Se ho problemi spero di ribeccarti.
Ciao a tutti e buon week-end.


Offline blastor

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Swipe in quattro direzioni
« Risposta #7 il: 23 Febbraio 2013, 02:38:48 CET »
0
undead vedendo che sei molto più pratico, l'evento "onGenericMotion" come ti sembra? come si comporterebbe? da quel che ho capito dalla documentazione fa più o meno quello che hai scritto tu, in cosa differisce?

Offline undead

  • Utente senior
  • ****
  • Post: 666
  • Respect: +113
    • Mostra profilo
  • Dispositivo Android:
    Samsung Galaxy S6
  • Play Store ID:
    DrKappa
  • Sistema operativo:
    Windows 10 64-bit, Windows 8.1 64-bit
Re:Swipe in quattro direzioni
« Risposta #8 il: 23 Febbraio 2013, 13:10:05 CET »
0
Ongenericmotion non l'ho mai usato ma ad occhio è uguale all'ontouch con la differenza che ti invia anche gli input di movimento non touch.
Quindi se hai un joystick o un mouse e ti muovi l'evento arriva alla ongenericmotion ma non alla ontouch.

Ma ripeto non l'ho mai usato magari mi sbaglio.  :-P

Offline blastor

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Nexus 4
Re:Swipe in quattro direzioni
« Risposta #9 il: 23 Febbraio 2013, 13:45:44 CET »
0
ok grazie non capivo infatti a cosa di riferiva con "OnGeneric"