Autore Topic: onTouchEvent continuo su una View  (Letto 2045 volte)

Offline daliz

  • Nuovo arrivato
  • *
  • Post: 13
  • I love Android!
  • Respect: 0
    • Mostra profilo
    • Datapixel
  • Dispositivo Android:
    Motorola Milestone
  • Play Store ID:
    Datapixel
  • Sistema operativo:
    Microsoft Windows 7
onTouchEvent continuo su una View
« il: 28 Marzo 2010, 16:39:30 CEST »
0
Salve a tutti :)

Sto lavorando su un giochino molto semplice. Il tutto avviene su una classe che estende View, dal momento che non ho bisogno di grandi framerate o funzioni particolari. Solo qualche piccolo sprite che si muove, quindi mi va bene.

Dunque, il mio problema è molto semplice: Ovverridando onTouchEvent, riesco a catturare eventi touch in qualsiasi parte dello schermo senza problemi. L'unico problema è che vorrei far sì che un evento di touch sia continuo e non singolo.

In altre parole, se clicco su uno sprite utilizzando onTouchEvent, l'evento viene catturato ma una volta sola. Per catturarne altri dovrei muovere il dito. E invece vorrei che gli eventi siano catturati continuamente semplicemente tenendo il dito premuto e fermo sul display.

Avete qualche idea al riguardo?

Grazie :)
« Ultima modifica: 15 Maggio 2010, 17:29:18 CEST da JD »

Offline Pinabello

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Htc Dream Tim
  • Sistema operativo:
    Mac os X
Re:onTouchEvent continuo su una View
« Risposta #1 il: 29 Marzo 2010, 17:42:46 CEST »
0
Ciao,
ultimamente stavo ripassando i Thread e leggendo il tuo post mi è venuta l'idea di risolvere il tuo problema proprio con un Thread.
Magari c'è un modo più semplice di farlo, ma ti posto quello che ho fatto, magari ti è utile  ;-).

Codice (Java): [Seleziona]
package it.pinabello.android.test;

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

public class TestActivity extends Activity {
        /** Called when the activity is first created. */

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.main);
                View view = findViewById(R.id.layout);
                view.setOnTouchListener(new OnContinuousTouchListener(500) {
                        @Override
                        public void onContinuousTouch(View v, MotionEvent event) {
                                System.out.println("Mi stai toccando !!! " + v.getId() + " " + event.getRawX() + " " + event.getRawY());
                        }
                });

        }

        public abstract class OnContinuousTouchListener extends Thread implements
                        OnTouchListener {

                private boolean running                    = true;
                private long       continuosEventtime = 500;
                private View      v                               = null;
                private MotionEvent event                 = null;

                @Override
                public void run() {
                        while (true) {
                                toccato();
                                try {
                                        Thread.sleep(500);
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                        }
                }

                public abstract void onContinuousTouch(View v, MotionEvent event);

                private synchronized void toccato() {
                        if (running) {
                                // System.out.println("Toccato !!! ");
                                onContinuousTouch(v, event);
                        } else {
                                try {
                                        System.out.println("Rilasciato !!! ");
                                        wait();
                                } catch (InterruptedException e) {
                                        e.printStackTrace();
                                }
                        }

                }

                public OnContinuousTouchListener(long continuosEventtime) {
                        this.continuosEventtime = continuosEventtime;
                        this.setDaemon(true);
                }

                @Override
                public synchronized boolean onTouch(View v, MotionEvent event) {
                        try {
                                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                                        this.v          = v;
                                        this.event      = event;
                                        running = true;
                                        if (isAlive()) {
                                                notify();
                                        } else {
                                                start();
                                        }
                                } else if (event.getAction() == MotionEvent.ACTION_UP) {
                                        running = false;
                                        this.v          = null;
                                        this.event      = null;
                                }
                        } catch (Exception e) {
                                running = false;
                                e.printStackTrace();
                        }
                        return true;
                }
        }

}

In pratica ho creato la classe OnContinuousTouchListener che implementa il metodo onContinuousTouch, tale metodo è un onTouch che non si ferma mai. Il parametro long che accetta il costruttore rappresenta ogni quanti millisecondi generare un evento onContinuousTouch.

Offline daliz

  • Nuovo arrivato
  • *
  • Post: 13
  • I love Android!
  • Respect: 0
    • Mostra profilo
    • Datapixel
  • Dispositivo Android:
    Motorola Milestone
  • Play Store ID:
    Datapixel
  • Sistema operativo:
    Microsoft Windows 7
Re:onTouchEvent continuo su una View
« Risposta #2 il: 29 Marzo 2010, 18:14:04 CEST »
0
Wow, è un bel lavorone quello che hai fatto :)

Di sicuro avrei sperato che si potesse risolvere la cosa impostando sulla view qualcosa tipo setContinuousTouch(true), ma il tuo è comunque un buon workaround :)

Purtroppo non sono sicuro che si adatti al mio scopo dal momento che ho già diversi thread attivi e ho paura che la cosa appesantisca ulteriormente la situazione. Comunque ti ringrazio ;)

Offline Jumig

  • Nuovo arrivato
  • *
  • Post: 2
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    Google Nexus One
  • Play Store ID:
    Paolo Zuliani
  • Sistema operativo:
    Ubuntu 9.04
Re:onTouchEvent continuo su una View
« Risposta #3 il: 31 Marzo 2010, 10:18:58 CEST »
0
In altre parole, se clicco su uno sprite utilizzando onTouchEvent, l'evento viene catturato ma una volta sola. Per catturarne altri dovrei muovere il dito. E invece vorrei che gli eventi siano catturati continuamente semplicemente tenendo il dito premuto e fermo sul display.

ciao,
se tieni il dito fermo non ti arrivano eventi proprio perchè non vengono generati :)
forse puoi semplicemente risolvere settando una variabile touching=true sull'evento MotionEvent.ACTION_DOWN e risettarla a false su MotionEvent.ACTION_UP.

Offline daliz

  • Nuovo arrivato
  • *
  • Post: 13
  • I love Android!
  • Respect: 0
    • Mostra profilo
    • Datapixel
  • Dispositivo Android:
    Motorola Milestone
  • Play Store ID:
    Datapixel
  • Sistema operativo:
    Microsoft Windows 7
Re:onTouchEvent continuo su una View
« Risposta #4 il: 31 Marzo 2010, 11:55:06 CEST »
0
Grazie Jumig,

infatti è quel che alla fine ho fatto... :)

Offline Pinabello

  • Nuovo arrivato
  • *
  • Post: 22
  • Respect: +12
    • Mostra profilo
  • Dispositivo Android:
    Htc Dream Tim
  • Sistema operativo:
    Mac os X
Re:onTouchEvent continuo su una View
« Risposta #5 il: 01 Aprile 2010, 14:45:58 CEST »
0
LOL, mi sono reso conto che sia implementando OnTouchListener, sia utilizzando onTouchEvent(MotionEvent event) delle Activity l'evento viene generato continuamente (a me ora serviva il contrario  o_O), invece, come si diceva ad inizio del topic, il metodo onTouchEvent(MotionEvent event) delle view genera un evento singolo.

Offline daliz

  • Nuovo arrivato
  • *
  • Post: 13
  • I love Android!
  • Respect: 0
    • Mostra profilo
    • Datapixel
  • Dispositivo Android:
    Motorola Milestone
  • Play Store ID:
    Datapixel
  • Sistema operativo:
    Microsoft Windows 7
Re:onTouchEvent continuo su una View
« Risposta #6 il: 01 Aprile 2010, 14:57:59 CEST »
0
Hehehe... :)

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:onTouchEvent continuo su una View
« Risposta #7 il: 01 Aprile 2010, 16:44:30 CEST »
0
ACTION_MOVE

gestisce gli eventi tra ACTION_DOWN e ACTION_UP. quindi è importante gestire questi ultimi due casi ritornando true.

Codice (Java): [Seleziona]
                myView.setOnTouchListener(new OnTouchListener() {
                       
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                               
                                if(event.getAction()==MotionEvent.ACTION_DOWN){
                                        Log.v("demo", "down");
                                        return true;
                                }
                               
                               
                                if(event.getAction()==MotionEvent.ACTION_MOVE){
                                        Log.v("demo", "move");
                                        return true;
                                }
                               
                                if(event.getAction()==MotionEvent.ACTION_UP){
                                        Log.v("demo", "up");
                                        return true;
                                }      
                                return false;
                        }
                });

meglio se fai un switch case :P


Saluti,
Qlimax

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:onTouchEvent continuo su una View
« Risposta #8 il: 01 Aprile 2010, 19:54:01 CEST »
0
scusa la domanda da newbie ma sto cercando di imparare il più possibile, il più velocemente possibile: la parte "Log.v (...);"  è per caso un metodo della classe view che permette di fare logging? devo implementare un logger per l'università e la cosa mi intriga...

grazie mille a priori  :-P

Offline Qlimax

  • Moderatore globale
  • Utente senior
  • *****
  • Post: 757
  • Respect: +202
    • Google+
    • _Qlimax
    • Mostra profilo
    • www.egsolutions.ch
  • Dispositivo Android:
    Galaxy Nexus - Nexus One - Wildfire - Magic
  • Play Store ID:
    egsolutions.ch
  • Sistema operativo:
    Ubuntu 12.04, Windows 7
Re:onTouchEvent continuo su una View
« Risposta #9 il: 10 Aprile 2010, 21:53:38 CEST »
0
scusa la domanda da newbie ma sto cercando di imparare il più possibile, il più velocemente possibile: la parte "Log.v (...);"  è per caso un metodo della classe view che permette di fare logging? devo implementare un logger per l'università e la cosa mi intriga...

grazie mille a priori  :-P
OT,  comunque
 è un metodo statico della classe Log, che permette di fare il debug attraverso il logcat di android.


@daliz
risolto?

Offline ScarfaceIII

  • Utente junior
  • **
  • Post: 112
  • Respect: +13
    • raferalston12
    • Mostra profilo
  • Dispositivo Android:
    Nexus One
  • Sistema operativo:
    GNU/Linux, Ubuntu 10.04 / Windows 7
Re:onTouchEvent continuo su una View
« Risposta #10 il: 11 Aprile 2010, 12:50:05 CEST »
0
grazie mille, nel frattempo avevo già capito a cosa serviva il Log :D

Offline zak84

  • Utente normale
  • ***
  • Post: 165
  • Respect: +2
    • Mostra profilo
Re:onTouchEvent continuo su una View
« Risposta #11 il: 04 Aprile 2011, 15:52:31 CEST »
0
Scusate se riapro il topic, ma credo possiate aiutarmi: a me il vostro metodo non fuinziona, nel senso che la scrollview mi si blocca e non scorre.
Io sto cercando di intercettare quando l'utente lascia il dito, per poter salvare in una variabile INTEGER la posizione X della scrollview:
Codice: [Seleziona]
public class Slide extends Activity{
        @Override
    public void onCreate(Bundle savedInstanceState){
        super.onCreate(savedInstanceState);
        requestWindowFeature(Window.FEATURE_NO_TITLE);
        getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN,WindowManager.LayoutParams.FLAG_FULLSCREEN);
        setContentView(R.layout.slide);
        HorizontalScrollView MiaVista = (HorizontalScrollView)findViewById(R.id.scollabile);
        MiaVista.setHorizontalScrollBarEnabled(false);
        MiaVista.setVerticalScrollBarEnabled(false);
        private Integer xspostamento=??????????????????
    }
}

grazie a chi riesce ad aiutarmi

Offline zak84

  • Utente normale
  • ***
  • Post: 165
  • Respect: +2
    • Mostra profilo
Re:onTouchEvent continuo su una View
« Risposta #12 il: 04 Aprile 2011, 16:01:18 CEST »
0
ho risolto da solo grazie ad un vostro consiglio, thanks.
Codice: [Seleziona]
        final TextView textView1 = (TextView)findViewById(R.id.textView1);
        MiaVista.setOnTouchListener(new OnTouchListener(){
            @Override
            public boolean onTouch(View v, MotionEvent event){
                    if(event.getAction()==MotionEvent.ACTION_DOWN){
                            textView1.setText("down");
                        return true;
                    }
                    if(event.getAction()==MotionEvent.ACTION_MOVE){
                            textView1.setText("move");
                        return true;
                    }
                    if(event.getAction()==MotionEvent.ACTION_UP){
                            textView1.setText("up");
                        return true;
                    }     
                    return false;
            }
        });
easy easy, tanto che su tutti i forum che ho chiesto, nessuno aveva una risposta :-| invece era una baggianata....