76 votes

Google Maps Android API v2 - détecter le toucher sur la carte

Je ne trouve pas d'exemple sur la façon d'intercepter le toucher de la carte sur la nouvelle API Google Maps v2.

J'ai besoin de savoir quand l'utilisateur touche la carte afin d'arrêter un fil (le centrage de la carte autour de ma position actuelle).

3 votes

Si quelqu'un a répondu à votre question, marquez votre question comme ayant reçu une réponse. De plus, vous avez explicitement dit "clique sur la carte", donc pas besoin de reprocher à ape ou CommonsWare de ne pas avoir su lire dans vos pensées.

1 votes

Je pourrais même le marquer comme répondu mais j'ai écrit "map touch", pas map "click". @ape dans un commentaire a suggéré un autre fil qui résout mon problème ( stackoverflow.com/questions/13722869/ ) mais je ne peux pas l'utiliser, comme je l'ai écrit dans les commentaires. Je n'arrive pas à trouver la solution sur ce fil de discussion ni sur le fil lié. Dois-je poser une autre question ?

0 votes

Votre réponse doit être une réponse, et non une modification de la question. Vous l'avez rendu très difficile à suivre. Si votre propre réponse est celle qui vous a le plus aidé, vous pouvez même l'accepter pour le montrer aux autres.

95voto

Gaucho Points 795

@ape a écrit une réponse ici sur la façon d'intercepter les clics de la carte, mais j'ai besoin d'intercepter les touches, et ensuite il a suggéré le lien suivant dans un commentaire de sa réponse, Comment gérer l'événement onTouch pour la carte dans l'API Google Map v2 ? .

Cette solution semble être une solution de contournement possible, mais le code proposé était incomplet. Pour cette raison, je l'ai réécrit et testé, et maintenant il fonctionne.

Voici le code de travail :

J'ai créé la classe MySupportMapFragment.java

import com.google.android.gms.maps.SupportMapFragment;
import android.os.Bundle;
import android.view.LayoutInflater;
import android.view.View;
import android.view.ViewGroup;

public class MySupportMapFragment extends SupportMapFragment {
    public View mOriginalContentView;
    public TouchableWrapper mTouchView;

    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState) {
        mOriginalContentView = super.onCreateView(inflater, parent, savedInstanceState);
        mTouchView = new TouchableWrapper(getActivity());
        mTouchView.addView(mOriginalContentView);
        return mTouchView;
    }

    @Override
    public View getView() {
        return mOriginalContentView;
    }
}

J'ai même créé la classe TouchableWrapper.java :

import android.content.Context;
import android.view.MotionEvent;
import android.widget.FrameLayout;

public class TouchableWrapper extends FrameLayout {

    public TouchableWrapper(Context context) {
        super(context);
    }

    @Override
    public boolean dispatchTouchEvent(MotionEvent event) {

        switch (event.getAction()) {

            case MotionEvent.ACTION_DOWN:
                  MainActivity.mMapIsTouched = true;
                  break;

            case MotionEvent.ACTION_UP:
                  MainActivity.mMapIsTouched = false;
                  break;
        }
        return super.dispatchTouchEvent(event);
    }
}

Dans la mise en page, je le déclare de cette façon :

<fragment xmlns:android="http://schemas.android.com/apk/res/android"
          android:id="@+id/mapFragment"
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:layout_alignParentBottom="true"
          android:layout_below="@+id/buttonBar"
          class="com.myFactory.myApp.MySupportMapFragment"
/>

Juste pour tester, dans l'activité principale, j'ai écrit seulement ce qui suit :

public class MainActivity extends FragmentActivity {
    public static boolean mMapIsTouched = false;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    }
}

3 votes

Voté en haut, car ce n'est pas ce dont l'utilisateur avait besoin mais c'est ce qu'il a demandé. Et c'est ce dont j'avais besoin :)

0 votes

@Gaucho, j'ai dû améliorer un peu cette solution, principalement en utilisant un écouteur personnalisé au lieu d'utiliser une variable statique publique. Voir la solution ci-dessous.

0 votes

@Dimitar : maintenant je n'ai pas le temps de le tester. Je vous le ferai savoir. Merci.

50voto

Sampath Kumar Points 577

Voici une solution simple pour obtenir la localisation en fonction de la sélection de l'utilisateur (option de clic sur la carte) :

googleMap.setOnMapClickListener(new OnMapClickListener() {
  @Override
  public void onMapClick(LatLng arg0) {
    // TODO Auto-generated method stub
    Log.d("arg0", arg0.latitude + "-" + arg0.longitude);
  }
});

3 votes

Ce processus fonctionne lorsque vous touchez la carte doucement mais lorsque vous touchez la carte plus difficilement et qu'elle commence à zoomer, pour cette raison la méthode onMapClick ne sera pas appelée.

1 votes

@Md.SajedulKarim vous pouvez désactiver tous les gestes avec googleMap.getUiSettings().setAllGesturesEnabled(false) ; et ensuite écouter ce tap, après avoir réactivé les gestes.

2 votes

SetOnMapClickListener n'est pas reconnu. Que dois-je importer ?

7voto

adarsh Points 617

https://developers.google.com/maps/documentation/Android/reference/com/google/Android/gms/maps/GoogleMap.OnMapClickListener

Voir ce lien. Implémentez l'interface et remplissez les champs onMapClick() ou celle dont vous avez besoin et définissez la méthode onMapClickListener à la bonne mise en œuvre.

public class YourActivity extends Activity implements OnMapClickListener {
    @Override
    protected void onCreate(Bundle icicle) { 
        super.onCreate(icicle);
        ...
        my_map.setOnMapClickListener(this)        
        ...
    }

    public void onMapClick (LatLng point) {
        // Do Something
    }
}

1 votes

Merci beaucoup à ndsmyter pour la réponse. Le onMapClick intercepte lorsque vous tapez sur la carte, mais il ne fonctionne pas lorsque vous déplacez le doigt sur la carte. J'ai besoin d'intercepter non seulement le clic sur la carte, mais aussi le déplacement de la carte. Savez-vous comment faire ?

2 votes

Le toucher de la carte n'est pas le "clic de la carte", donc la question n'a pas de réponse. J'ai besoin d'intercepter le mouvement de la carte en raison du toucher de l'utilisateur sur la carte et je ne peux pas trouver un moyen efficace d'intercepter cette action. Je pense que je ne peux pas utiliser le setOnCameraChangeListener car j'utilise toujours la méthode animateCamera pour mettre à jour l'emplacement de la caméra dans mon code, alors j'ai juste besoin d'un écouteur pour intercepter le toucher sur la carte pendant le panoramique de la carte.

0 votes

Je pense que vous avez besoin de la onMarkerDragListener ? developers.google.com/maps/documentation/Android/reference/com/

1voto

Léon Pelletier Points 829

Pour Mono amoureux :

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using Android.App;
using Android.Content;
using Android.OS;
using Android.Runtime;
using Android.Util;
using Android.Views;
using Android.Widget;
using Android.Gms.Maps;

namespace apcurium.MK.Booking.Mobile.Client.Controls
{
    public class TouchableMap : SupportMapFragment
    {
        public View mOriginalContentView;

        public TouchableWrapper Surface;

        public override View OnCreateView(LayoutInflater inflater, ViewGroup parent, Bundle savedInstanceState)
        {
            mOriginalContentView = base.OnCreateView(inflater, parent, savedInstanceState);
            Surface = new TouchableWrapper(Activity);
            Surface.AddView(mOriginalContentView);
            return Surface;
        }

        public override View View
        {
            get
            {
                return mOriginalContentView;
            }
        }
    }

    public class TouchableWrapper: FrameLayout {

        public event EventHandler<MotionEvent> Touched;

        public TouchableWrapper(Context context) :
        base(context)
        {
        }

        public TouchableWrapper(Context context, IAttributeSet attrs) :
        base(context, attrs)
        {
        }

        public TouchableWrapper(Context context, IAttributeSet attrs, int defStyle) :
        base(context, attrs, defStyle)
        {
        }

        public override bool DispatchTouchEvent(MotionEvent e)
        {
            if (this.Touched != null)
            {
                this.Touched(this, e);
            }

            return base.DispatchTouchEvent(e);
        }
    }
}

0voto

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X