Autore Topic: ContextMenu su una MapView  (Letto 1152 volte)

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
ContextMenu su una MapView
« il: 03 Settembre 2010, 15:23:47 CEST »
0
Salve a tutti,

come da titolo, sto cercando di ottenere un risultato simile a quello che si ha sull'applicazione nativa Maps (foto in allegato), in modo che quando si clicca per qualche secondo su di un punto compaia un menu contestuale e si riesca a salvare le coordinate di quel punto.

Pensavo di utilizzare però ad ogni tocco mi vengono restituite le coordinate e non posso più spostare la mappa

Codice (Java): [Seleziona]
mapView.setOnTouchListener(new OnTouchListener() {
                       
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                if (event.getAction() == MotionEvent.ACTION_UP) {
                            point = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());
                         Toast.makeText(getBaseContext(),
                                    point.getLatitudeE6() / 1E6 + "," + point.getLongitudeE6() / 1E6,
                                    Toast.LENGTH_SHORT).show();
                           
                            mapController.animateTo(point);
                            mapController.setZoom(10);
                   
                            mapOverlays.clear();
                           
                        }
                                return true;
                        }
                });
« Ultima modifica: 03 Settembre 2010, 15:26:44 CEST da niko_2307 »

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ContextMenu su una MapView
« Risposta #1 il: 03 Settembre 2010, 21:33:22 CEST »
0
sto provando quest'altra alternativa ma evidentemente non utilizzo correttamente il registerForContextMenu(mapView), dato che dal log non vedo invocato il metodo onCreateContextMenu
Codice (Java): [Seleziona]
mapView.setOnTouchListener(new OnTouchListener() {
                       
                        @Override
                        public boolean onTouch(View v, MotionEvent event) {
                                if (event.getAction() == MotionEvent.ACTION_UP) {
                                        GeoPoint point = mapView.getProjection().fromPixels((int) event.getX(), (int) event.getY());
                                        registerForContextMenu(mapView);
                                        Log.i(TAG_LOG, "ACTION UP");
                                        return true;
                                } else if ((event.getAction() == MotionEvent.ACTION_DOWN)) {
                                        Log.i(TAG_LOG, "ACTION DOWN");
                                        return true;
                                }
                               
                                return false;
                        }
                });


qualche suggerimento??

Offline Ricky`

  • Amministratore
  • Utente storico
  • *****
  • Post: 3489
  • Respect: +507
    • Github
    • Google+
    • rciovati
    • Mostra profilo
Re:ContextMenu su una MapView
« Risposta #2 il: 03 Settembre 2010, 21:47:41 CEST »
0
Io in un progetto per l'uni ho usato questa libreria che è una vera manna:


 mapview-overlay-manager -
 
 Project Hosting on Google Code


Molto carino il supporto al doppio tap :)

Ti allego il codice dell'activity che avevo scritto...
Codice (Java): [Seleziona]
package mobidata.progetto;

import java.io.IOException;
import java.util.List;
import java.util.Locale;

import mobidata.progetto.data.Event;
import android.app.AlertDialog;
import android.content.DialogInterface;
import android.content.Intent;
import android.location.Address;
import android.location.Geocoder;
import android.location.Location;
import android.os.Bundle;
import android.view.MotionEvent;

import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;
import com.google.android.maps.GeoPoint;

import de.android1.overlaymanager.ManagedOverlay;
import de.android1.overlaymanager.ManagedOverlayItem;
import de.android1.overlaymanager.OverlayManager;
import de.android1.overlaymanager.ZoomEvent;
import de.android1.overlaymanager.ManagedOverlayGestureDetector.OnOverlayGestureListener;

public class CreateEventMap extends MapActivity {

        MapView mappa;
        MapController mapCtr;
        Event event;
        Location location;
        String login;
        OverlayManager overlayManager;

        public void onCreate(Bundle savedInstanceState) {
                super.onCreate(savedInstanceState);
                setContentView(R.layout.mappa);

                Bundle b = getIntent().getExtras();
                this.location = b.getParcelable("location");
                this.login = b.getString("login");

                mappa = (MapView) findViewById(R.id.map);

                mapCtr = mappa.getController();

                mappa.setBuiltInZoomControls(true);
                mapCtr.setCenter(new GeoPoint((int) (location.getLatitude() * 1E6),
                                (int) (location.getLongitude() * 1E6)));

                mapCtr.setZoom(17);

                overlayManager = new OverlayManager(getApplication(), mappa);

        }

        @Override
        public void onWindowFocusChanged(boolean b) {
                createMyLocationOverlay();
        }

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

        public void createMyLocationOverlay() {
                ManagedOverlay managedOverlay = overlayManager.createOverlay(
                                "myLocOverlay", getResources().getDrawable(
                                                R.drawable.user_loc_maker));
                GeoPoint p = new GeoPoint((int) (this.location.getLatitude() * 1E6),
                                (int) (this.location.getLongitude() * 1E6));
                managedOverlay.createItem(p, "You are here!");
                managedOverlay
                                .setOnOverlayGestureListener(new OnOverlayGestureListener() {

                                        public boolean onZoom(ZoomEvent arg0, ManagedOverlay arg1) {
                                                return false;
                                        }

                                        public boolean onSingleTap(MotionEvent arg0,
                                                        ManagedOverlay arg1, GeoPoint arg2,
                                                        ManagedOverlayItem arg3) {
                                                return false;
                                        }

                                        public boolean onScrolled(MotionEvent arg0,
                                                        MotionEvent arg1, float arg2, float arg3,
                                                        ManagedOverlay arg4) {

                                                return false;
                                        }

                                        public void onLongPressFinished(MotionEvent arg0,
                                                        ManagedOverlay arg1, GeoPoint arg2,
                                                        ManagedOverlayItem arg3) {

                                        }

                                        public void onLongPress(MotionEvent arg0,
                                                        ManagedOverlay arg1) {

                                        }

                                        public boolean onDoubleTap(MotionEvent event,
                                                        ManagedOverlay arg1, final GeoPoint point,
                                                        ManagedOverlayItem arg3) {

                                                if (!isValidPoint(point))
                                                        return false;

                                                Geocoder geoCoder = new Geocoder(getBaseContext(),
                                                                Locale.getDefault());
                                                try {
                                                        List<Address> addresses = geoCoder.getFromLocation(
                                                                        point.getLatitudeE6() / 1E6, point
                                                                                        .getLongitudeE6() / 1E6, 1);

                                                        String add = "";
                                                        if (addresses.size() > 0) {
                                                                for (int i = 0; i < addresses.get(0)
                                                                                .getMaxAddressLineIndex(); i++)
                                                                        add += addresses.get(0).getAddressLine(i)
                                                                                        + " ";
                                                        }
                                                        final String address = add;
                                                        AlertDialog.Builder builder = new AlertDialog.Builder(
                                                                        CreateEventMap.this);
                                                        builder.setTitle("Create Event");
                                                        builder
                                                                        .setMessage("Do you want to create an event in:\n"
                                                                                        + add);
                                                        builder.setNeutralButton("Cancel",
                                                                        new DialogInterface.OnClickListener() {
                                                                                public void onClick(
                                                                                                DialogInterface dlg, int sumthin) {

                                                                                }
                                                                        });

                                                        builder.setPositiveButton("Yes",
                                                                        new DialogInterface.OnClickListener() {
                                                                                public void onClick(
                                                                                                DialogInterface dlg, int sumthin) {
                                                                                        Bundle b = new Bundle();
                                                                                        b.putString("Address", address);
                                                                                        b.putString("Login", login);
                                                                                        Intent i = new Intent(
                                                                                                        CreateEventMap.this,
                                                                                                        CreateEvent.class);
                                                                                        i.putExtras(b);
                                                                                        startActivity(i);
                                                                                        finish();
                                                                                }
                                                                        });
                                                        builder.show();
                                                } catch (IOException e) {
                                                        e.printStackTrace();
                                                }
                                                return true;
                                        }
                                });

                overlayManager.populate();
        }

        /**
         * Controlla se il punto passato è all'interno dell'area considerata dal
         * progetto
         *
         * @param p
         * @return
         */

        private boolean isValidPoint(GeoPoint p) {
                if (p.getLatitudeE6() > 45.45 * 1E6 && p.getLatitudeE6() < 45.475 * 1E6) {
                        if (p.getLongitudeE6() > 9.17 * 1E6
                                        && p.getLongitudeE6() < 9.205 * 1E6)
                                return true;
                }
                return false;
        }

}
« Ultima modifica: 03 Settembre 2010, 21:49:56 CEST da Ricky` »

Offline niko_2307

  • Nuovo arrivato
  • *
  • Post: 27
  • Respect: 0
    • Mostra profilo
  • Dispositivo Android:
    HTC Hero
Re:ContextMenu su una MapView
« Risposta #3 il: 07 Settembre 2010, 22:03:04 CEST »
0
ma con questo codice non ti è mai capitato che l'applicazione vada in crash?

io ho trovato questo codice ma non riesco ad applicarlo
Codice (Java): [Seleziona]
import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import com.google.android.maps.MapView;
public class MyMapView extends MapView {
        private long lastTouchTime = -1;
        public MyMapView(Context context, AttributeSet attrs) {
                super(context, attrs);
        }
       
        @Override
        public boolean onInterceptTouchEvent(MotionEvent ev) {
                if (ev.getAction() == MotionEvent.ACTION_DOWN) {
                        long thisTime = System.currentTimeMillis();
                        if (thisTime – lastTouchTime < 250) {
                                // Double tap
                                this.getController().zoomInFixing((int) ev.getX(),
                                                (int) ev.getY());
                                lastTouchTime = -1;
                        } else {
                                // Too slow
                                lastTouchTime = thisTime;
                        }
                }
               
                return super.onInterceptTouchEvent(ev);
        }
}