Autore Topic: Non capisco come funzionano gli eventi di touch screen su dipositivo reale  (Letto 633 volte)

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Ciao a tutti. Ho il seguente codice:

[import android.app.Activity;
import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import android.widget.TextView;

public class TouchProjectActivity extends Activity {
   private TextView logArea;
   private boolean erase = false;
   private int counter;
    /** Called when the activity is first created. */
    @Override
    public void onCreate(Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);
       setContentView(R.layout.main);
       logArea = (TextView) findViewById(R.id.logArea);
       //Tocco
       logArea.setOnTouchListener(new OnTouchListener() {
       @Override
          public boolean onTouch(View view, MotionEvent event) {
             float x = event.getX();
             float y = event.getY();
             switch (event.getAction()) {
             case MotionEvent.ACTION_DOWN:
                if(erase) {
                   logArea.setText("");
                   counter = 0;
                }
                logArea.append("DOWN: (" + x + ", " + y + ")    ");
                counter++;
                break;
                case MotionEvent.ACTION_MOVE:
                logArea.append("MOVE: (" + x + ", " + y + ")    ");
                counter++;
                break;
                case MotionEvent.ACTION_UP:
                counter++;
                logArea.append("UP: (" + x + ", " + y + ")    Contatore: " + counter);
                erase = true;
                
                break;
             }
                
             return true;
          }
      });
   }
   
}]

Adesso eseguo la mia applicazione e tengo fermo il dito sullo schermo del cellulare. L'evento percepito è MotionEvent.ACTION_DOWN ed inoltre una serie di eventi MotionEvent.ACTION_MOVE. Coppie molteplici di punti vengono restituite e non soltanto una coppia di coordinate come mi aspettavo.
Se eseguo l'applicazione sul simulatore mi viene restituito solo un punto e un evento MotionEvent.ACTION_DOWN, come mi aspetto. Come mai?
Io ho bisogno necessariamente di un solo punto (quello al centro del dito se possibile o uno vicino) perchè devo leggere il suo colore esatto per fare qualche azione appropriata in base al colore.
Sull'emulatore funziona, sul dispositivo no.
Cosa posso fare per risolvere il problema?
Grazie in anticipo.

Offline bradipao

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 4043
  • keep it simple
  • Respect: +567
    • Github
    • Google+
    • bradipao
    • Mostra profilo
  • Dispositivo Android:
    Nexus 5
  • Play Store ID:
    Bradipao
  • Sistema operativo:
    W7
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #1 il: 17 Settembre 2011, 18:50:07 CEST »
0
La differenza tra emulatore e dispositivo è quasi certamente dovuta al fatto che l'emulatore non è multitouch.  :D

Il fatto che ti ritorni tutti i pointer possibili è perfettamente compatibile con le API di Android. Guarda un po' le due righe di codice riportate nella documentazione ufficiale e vedi un esempio abbastanza semplice di uso dei multi-pointer.

MotionEvent | Android Developers

PS: formatta il codice con il bottoncino
NON rispondo a domande nei messaggi privati
Bradipao @ Play Store

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #2 il: 19 Settembre 2011, 16:56:22 CEST »
0
Non credo si tratti di multitouch perchè ho usato l'istruzione seguente
Codice (Java): [Seleziona]
int touchId = event.getAction() & MotionEvent.ACTION_POINTER_ID_MASK;e ogni volta sul cellulare mi da lo stesso id.

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #3 il: 19 Settembre 2011, 17:08:38 CEST »
0
Le coppie molteplici di punti rientrano in un intorno abbastanza piccolo del punto che effettivamente ti interessa?
Fai conto che il dito proprio fermo non stà, eh?

Ad ogni modo potresti normalizzare le coordinate, dividendo lo schermo in una griglia di NxM punti.
Quando tocchi, dividi la coordinata x per N, casti ad intero e rimoltiplichi per N: così avrai unicamente step di N in orizzontale, quindi discretizzi il tutto.
La stessa cosa va fatta per la y, con M.
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #4 il: 19 Settembre 2011, 17:28:21 CEST »
0
Grazie. L'idea di discretizzare ogni punto del display mi sembra buona. Il fatto è che voglio attivare la vibrazione creando dei pattern (vibro per x millisecondi, non vibro per y millisecondi e cosi via) in base al colore del pixel su cui mi sposto nell'immagine.  In sintesi voglio esplorare l'immagine e in base al colore del pixel preso attivare un pattern diverso. E' conveniente anche acquisire le coordinate ogni tot millisecondi piuttosto che stare li ad analizzare continuamente gli spostamenti del dito? Può essere utile fissare una soglia di tolleranza dello spostamento? Voglio dire questo: leggo il valore delle coordinate attuali e le confronto con quelle precedentemente memorizzate lungo le 2 direzioni: se la differenza in valore assoluto è al di sotto di una data soglia non controllo il colore del pixel corrispondente alle nuove coordinate, altrimenti controllo il suo colore ed eventualmente cambio pattern di vibrazione. Ma che soglia scegliere?
Grazie ancora

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #5 il: 19 Settembre 2011, 17:41:27 CEST »
0
Comunque 7h38ugg3r mi basta arrotondare le coordinate o fare il cast a int, perche come dici tu, se ho ad esempio la coordinata x = 128,34 ed N(dimensione in pixel dello schermo) = 320, ottengo la seguente cosa:
  128,34/320 = 0,4 => cast a int=>0xN =0
e cosi per tutte le altre coordinate. O forse tu intendi "ridurre" ulteriormente la dimensione dell'area utile dello schermo? Quindi per uno 320x430(dimensione dell'immagine a schermo pieno) la faccio diventare 280x390 per esempio?
 
« Ultima modifica: 19 Settembre 2011, 17:52:40 CEST da Andrew »

Offline 7h38ugg3r

  • Moderatore globale
  • Utente storico
  • *****
  • Post: 1200
  • Respect: +133
    • riccardofischetti
    • th38ugg3r
    • @7h38ugg3r
    • Mostra profilo
  • Dispositivo Android:
    Galaxy-S GT I-9000/ ASUS Eee Pad Transformer
  • Play Store ID:
    Riccardo Fischetti
  • Sistema operativo:
    OS X Lion / Linux Mint 11 (Katya)
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #6 il: 20 Settembre 2011, 12:30:16 CEST »
0
N non è la risoluzione orizzontale, ma il numero di blocchi in cui dividi lo schermo orizzontalmente.
Se dividi lo schermo in 10 blocchi hai:

128,34 / 10 = 12,834 => cast a int => 12 x 10 = 120

la stessa cosa avviene per 125,22, che darà sempre 120

Alla fine, il pixel con il dito non lo prenderai mai, quindi è meglio trattare porzioni di schermo più compatibili con un dito...
7h38ugg3r<=>thebugger
Non conosci Java? Allora sei nel posto sbagliato!

http://www.androidpatterns.com/

Offline Andrew

  • Nuovo arrivato
  • *
  • Post: 10
  • Respect: 0
    • Mostra profilo
  • Sistema operativo:
    Ubuntu 11.04, Windows Xp
Re:Non capisco come funzionano gli eventi di touch screen su dipositivo reale
« Risposta #7 il: 20 Settembre 2011, 13:01:30 CEST »
0
N non è la risoluzione orizzontale, ma il numero di blocchi in cui dividi lo schermo orizzontalmente.
Se dividi lo schermo in 10 blocchi hai:

128,34 / 10 = 12,834 => cast a int => 12 x 10 = 120

la stessa cosa avviene per 125,22, che darà sempre 120

Alla fine, il pixel con il dito non lo prenderai mai, quindi è meglio trattare porzioni di schermo più compatibili con un dito...

Grazie per il chiarimento. Faccio alcune prove...