Autore Topic: Impossibile pan se uso setOnTouchListener  (Letto 803 volte)

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Impossibile pan se uso setOnTouchListener
« il: 17 Maggio 2011, 22:44:28 CEST »
0
Ciao a tutti!
Il mio problema è questo: Ho una MapView, voglio permettere di fare il pan e lo zoom, ma voglio anche che al momento della pressione in un punto mi vengano restituite in un toast le coordinate di quel punto...
Il fatto è che se non inserisco il metodo setOnTouchListener riesco a fare il pan ma non mi intercetta le azioni sullo chermo.
Viceversa, se uso etOnTouchListener posso rilevare le azioni sullo schermo, ma il pan non funziona più.
Ho letto questo post Pan | E-com DevBlog e sembra che sia un problema con non una facile soluzione..
Solo che se fate caso, l'applicazione Mappe di google se ti tiene premuto su un punto della mappa visualizza l'indirizzo!
Lascio il codice della classe! :-P
Codice: [Seleziona]
public class Map_forPoint extends MapActivity implements OnTouchListener {

        MapView map;
        MapController mapCtrl;
        List<Overlay> mapOverlays;
        GeoPoint p;

        @Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
        setContentView(R.layout.map);

        map = (MapView) findViewById(R.id.mapView);
        mapOverlays = map.getOverlays();
        mapCtrl = map.getController();
       
        // Rendiamo la mappa cliccabile e quindi ne permettiamo il pan
        map.setClickable(true);

        // Utiliziamo i controlli predefiniti per la gestione delle operazioni di zoom
        map.setBuiltInZoomControls(true);

        // Impostiamo la distanza dello Zoom a 12 (valori validi da 1 a 21).
        mapCtrl.setZoom(12);
       
       
       
        p = new GeoPoint(44629360, 10906720);

        mapCtrl.animateTo(p);
        mapCtrl.setZoom(17);
       
       
        map.setOnTouchListener(this);  //QUESTO È IL METODO INCRIMINATO :P

               

        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        p = map.getProjection().fromPixels((int) event.getX(),
                                        (int) event.getY());
                        Toast.makeText(getBaseContext(),
                                        p.getLatitudeE6() / 1E6 + "," + p.getLongitudeE6() / 1E6,
                                        Toast.LENGTH_SHORT).show();

//                        mapCtrl.animateTo(p);
//                        mapCtrl.setZoom(18);

                        mapOverlays.clear();
                        mapOverlays.add(new MapOverlay());

                        map.invalidate();
                }
                return true;
        }

        class MapOverlay extends Overlay {

                public MapOverlay() {
                }

                public void draw(Canvas canvas, MapView mapView, boolean shadow) {
                        super.draw(canvas, mapView, shadow);

                        // translate the GeoPoint to screen pixels
                        Point screenPoint = new Point();
                        mapView.getProjection().toPixels(p, screenPoint);

                        Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                                        R.drawable.map_pin);
                        canvas.drawBitmap(bmp, screenPoint.x - 12, screenPoint.y - 48, null);
                }
        }

        @Override
        protected boolean isRouteDisplayed() {
                return false;
        }

       
}

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:Impossibile pan se uso setOnTouchListener
« Risposta #1 il: 18 Maggio 2011, 15:23:58 CEST »
0
Ho trovato una soluzione un po' spartana: inserire un pulsante che mi faccia lo switch da una modalità all'altra...
Solo che mi servirebbe un metodo che tolga la registrazione che avevo fatto con setOnTouchListener

Avete qualche idea?

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Impossibile pan se uso setOnTouchListener
« Risposta #2 il: 18 Maggio 2011, 16:03:55 CEST »
0
setOnTouchListener(null);
dato che c'è n'è uno solo, non si fa add e remove, ma set(listener) set(niente)
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia

Offline cadupper

  • Utente junior
  • **
  • Post: 81
  • Respect: 0
    • cadupper
    • Mostra profilo
  • Dispositivo Android:
    HTC Magic Tim (32A)
  • Play Store ID:
    cadupper
  • Sistema operativo:
    Ubuntu 10.04
Re:Impossibile pan se uso setOnTouchListener
« Risposta #3 il: 18 Maggio 2011, 17:45:40 CEST »
0
setOnTouchListener(null);
dato che c'è n'è uno solo, non si fa add e remove, ma set(listener) set(niente)

Grazie mille! questo ha risolto il mio problema per ora

Anche se è un po' ingarbugliato ho implementato in questo modo:
Codice: [Seleziona]
@Override
        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.map);

                map = (MapView) findViewById(R.id.mapView);
                mapOverlays = map.getOverlays();
                mapCtrl = map.getController();

                // Rendiamo la mappa cliccabile e quindi ne permettiamo il pan
                map.setClickable(true);

                // Utiliziamo i controlli predefiniti per la gestione delle operazioni
                // di zoom
                map.setBuiltInZoomControls(true);

                initialGeoPoint = new GeoPoint(45422552, 12062302);  //imposto la vista all'avvio

                mapCtrl.animateTo(initialGeoPoint);
                mapCtrl.setZoom(11);

                map.invalidate();

                switchButton = (Button) findViewById(R.id.bu_switchTouch);
                switchButton.setOnClickListener(new View.OnClickListener() {
                        public void onClick(View v) {
                                if (!switchTouch) {
                                        setTouchable(map);
                                        switchTouch = true;
                                        switchButton.setText("Move");
                                } else {
                                        setNotTouchable(map);
                                        switchTouch = false;
                                        switchButton.setText("Set Point");
                                }
                        }
                });
        }

        private void setTouchable(MapView map) {
                map.setOnTouchListener(this);
        }

        private void setNotTouchable(MapView map) {
                map.setOnTouchListener(null);
        }

        @Override
        public boolean onTouch(View v, MotionEvent event) {
                if (event.getAction() == MotionEvent.ACTION_DOWN) {
                        savedGeoPoint = map.getProjection().fromPixels((int) event.getX(),
                                        (int) event.getY());
                        Toast.makeText(getBaseContext(),
                                        savedGeoPoint.getLatitudeE6() / 1E6 + "," + savedGeoPoint.getLongitudeE6() / 1E6,
                                        Toast.LENGTH_SHORT).show();
                        savePointButton.setVisibility(View.FOCUS_UP);
                        mapOverlays.clear();
                        mapOverlays.add(new MapOverlay());

                        map.invalidate();
                }
                return true;
        }

        class MapOverlay extends Overlay {

                public MapOverlay() {
                }

                public void draw(Canvas canvas, MapView mapView, boolean shadow) {
                        super.draw(canvas, mapView, shadow);

                        // translate the GeoPoint to screen pixels
                        Point screenPoint = new Point();
                        mapView.getProjection().toPixels(initialGeoPoint, screenPoint);

                        Bitmap bmp = BitmapFactory.decodeResource(getResources(),
                                        R.drawable.map_pin);
                        canvas.drawBitmap(bmp, screenPoint.x - 12, screenPoint.y - 48, null);
                }
        }

        @Override
        protected boolean isRouteDisplayed() {
                return false;
        }

}


Funziona abbastanza bene, ma c'è un modo per fare sia il pan che ricevere gli input senza implementare un bottone..?
Ciao, grazie ancora!!! :-)

Offline Nicola_D

  • Utente storico
  • *****
  • Post: 2479
  • SBAGLIATO!
  • Respect: +323
    • Github
    • Google+
    • nicoladorigatti
    • Mostra profilo
  • Dispositivo Android:
    Nexus 6p, Nexus 4, Nexus S, Nexus 7(2012)
  • Sistema operativo:
    Windows 7
Re:Impossibile pan se uso setOnTouchListener
« Risposta #4 il: 19 Maggio 2011, 00:08:30 CEST »
0
purtroppo non ti so aiutare,non ho fatto molto con le mapview a dire il vero... speriamo ci sia qualcuno che ha fatto qualcosa a riguardo
IMPORTANTE:NON RISPONDO A PROBLEMI VIA MESSAGGIO PRIVATO
LOGCAT: Non sai cos'è? -> Android Debug Bridge | Android Developers
               Dov'è in Eclipse? -> Window -> Open Prospective -> DDMS e guarda in basso!
[Obbligatorio] Logcat, questo sconosciuto! (Gruppo AndDev.it LOGTFO) - Android Developers Italia