Android: ItemizedOverlay onTouchEvent et onTap qui se chevauchent
Je suis en train de placer un marqueur sur une carte de superposition et d'en présenter une boîte de dialogue lorsque l'utilisateur sélectionne le drawable. Le problème est que les événements semblent se chevaucher. Après je clique sur la carte et le marqueur est établi, le onTap se déclenche immédiatement après, et parce que j'ai juste dessiné au marqueur, il est directement sous la onTap cas, si mon dialogue se déclenche toujours. Quelqu'un aurait-il des suggestions sur la façon de faire de ces événements mutuellement exclusifs?
Voici le code pour la carte d'activité:
public class SelectGameLocation extends MapActivity implements GestureDetector.OnGestureListener, GestureDetector.OnDoubleTapListener {
private MapView mapView = null;
private SelectGameLocationItemizedOverlay selectLocationOverlay = null;
private List<Overlay> mapOverlays = null;
private GestureDetector gestureDetector = null;
@Override
protected void onCreate(Bundle arg0) {
super.onCreate(arg0);
//set the layout
setContentView(R.layout.activity_select_game_location);
//configure activity for double clicks
gestureDetector = new GestureDetector(this);
gestureDetector.setOnDoubleTapListener(this);
//create and configure mapview
mapView = (MapView) findViewById(R.id.selectGameLocation);
mapView.setBuiltInZoomControls(true);
mapView.setHapticFeedbackEnabled(true);
//configure the overlay to draw the icons on the map
mapOverlays = mapView.getOverlays();
Drawable drawable = this.getResources().getDrawable(R.drawable.map_icon);
selectLocationOverlay = new SelectGameLocationItemizedOverlay(drawable, this);
mapOverlays.add(selectLocationOverlay);
}
@Override
public boolean dispatchTouchEvent(MotionEvent ev) {
gestureDetector.onTouchEvent(ev);
return super.dispatchTouchEvent(ev);
}
@Override
public boolean onDoubleTap(MotionEvent me) {
GeoPoint p = GeoPointHelper.getPointClicked(me, mapView);
mapView.getController().animateTo(p);
mapView.getController().zoomIn();
return true;
}
//Overridden methods but not used
@Override
public boolean onDoubleTapEvent(MotionEvent me) {
return false;
}
@Override
public boolean onDown(MotionEvent me) {
return false;
}
@Override
protected boolean isRouteDisplayed() {
return false;
}
@Override
public void onShowPress(MotionEvent e) {
}
@Override
public boolean onSingleTapConfirmed(MotionEvent me) {
return false;
}
@Override
public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) {
return false;
}
@Override
public void onLongPress(MotionEvent e) {
}
@Override
public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) {
return false;
}
@Override
public boolean onSingleTapUp(MotionEvent me) {
return false;
}
}
et le code de la superposition de classe:
public class SelectGameLocationItemizedOverlay extends ItemizedOverlay {
private Context context = null;
private List<OverlayItem> overlays = new ArrayList<OverlayItem>();
public SelectGameLocationItemizedOverlay(Drawable marker, Context context) {
super(boundCenterBottom(marker));
this.context = context;
}
@Override
protected boolean onTap(int index) {
OverlayItem itemClicked = overlays.get(index);
AlertDialog.Builder dialog = new AlertDialog.Builder(context);
dialog.setTitle(itemClicked.getTitle());
dialog.setMessage(itemClicked.getSnippet());
dialog.setCancelable(true);
dialog.setPositiveButton(R.string.yes, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(this.getClass().getName(), "Selected Yes To Add Location");
((SelectGameLocation) context).finish();
}
});
dialog.setNegativeButton(R.string.no, new DialogInterface.OnClickListener() {
public void onClick(DialogInterface dialog, int id) {
Log.i(this.getClass().getName(), "Selected No To Add Location");
dialog.cancel();
}
});
dialog.show();
return true;
}
@Override
public boolean onTouchEvent(MotionEvent me, MapView mapView) {
drawMarker(GeoPointHelper.getPointClicked(me, mapView));
return super.onTouchEvent(me, mapView);
}
private OverlayItem drawMarker(GeoPoint p) {
OverlayItem overlayitem = new OverlayItem(p, "Select As Game Location?", "Do you want this location to be added as the location for the game?");
getOverlays().clear();
addOverlay(overlayitem);
return overlayitem;
}
public List<OverlayItem> getOverlays() {
return overlays;
}
public void addOverlay(OverlayItem overlay) {
overlays.add(overlay);
populate();
}
@Override
protected OverlayItem createItem(int i) {
return overlays.get(i);
}
@Override
public int size() {
return overlays.size();
}
}
OriginalL'auteur CWayman | 2011-02-11
Vous devez vous connecter pour publier un commentaire.
J'ai eu exactement le même problème, mon onTouchEvent ajouté un marqueur sur une carte, et je voulais que ça pour afficher des informations à propos de ce marqueur lorsque l'utilisateur clique dessus, il a travaillé, mais il a aussi ajouté un autre marqueur.
Donc je l'ai pas utiliser onTouchEvent de tout faire dans onTap(int index) et onTap(Geopoint p, MapView mapView) comme suit:
Ce qui concerne,
Tom
Je montre une vue (la vue est privé de superposition) dans onTap(int index) et de fermer ce point de vue dans un autre onTap si elle est visible
J'ai utilisé une variable global pour stocker mon index.
Le si(Taraudé) ne fonctionne pas. Il est toujours faux, soit j'ai cliqué à l'intérieur de la superposition ou à l'extérieur.
OriginalL'auteur Tom
Si vous êtes à la mise à jour de la précédente, la superposition, l'ensemble
isFirst=true;
dans l'appel à " supprimer() pour supprimer la surcouche en question.Dans le
onTap()
appel, utilisezJ'espère que ça va fonctionner de la même si
isFirst=true
est situé dans leonDraw()
.OriginalL'auteur Naresh R
Je pense que le problème est fondamentalement que la onTap est un particulier onTouchEvent, donc si vous écrivez à la fois dans le revêtement, ils sont à la fois déclenché lorsque vous touchez la carte
Vous pourriez essayer d'ajouter un nouvel élément de superposition dans l'un des événements tactiles-vous mis en œuvre dans votre mapActivity et de laisser le onTap événement dans la superposition comme il est maintenant
il pourrait fonctionner de cette façon, mais vous devez l'essayer, je ne suis pas sûr!
OriginalL'auteur scambione