package com.didi.es.map.base;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Iterator;
import java.util.Map;
import java.util.Map.Entry;
import java.util.Set;
import android.util.Log;
import com.tencent.tencentmap.mapsdk.maps.TencentMap.OnInfoWindowClickListener;
import com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMapClickListener;
import com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMapLongClickListener;
import com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMarkerClickListener;
import com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMarkerDragListener;
import com.tencent.tencentmap.mapsdk.maps.model.LatLng;
import com.tencent.tencentmap.mapsdk.maps.model.Marker;
/**
* 事件大总管,接管地图相关的常用事件的监听器的注册和分发。可按需继续扩展。 用法:EsMapView.getEventHub().registerXXX();
* EsMapView.getEventHub().unregisterXXX();
*
* @author houshengyong
* @since 2015-5-26
*/
public class EsMapEventHub
implements OnMarkerClickListener, OnInfoWindowClickListener, OnMarkerDragListener, OnMapClickListener, OnMapLongClickListener {
private static final String TAG = EsMapEventHub.class.getSimpleName();
/**
* 包级权限
*/
EsMapEventHub() {
}
/**
* marker相关监听器集合。key是marker的id, value是相应的监听器。
*/
private Map<String, OnMarkerClickListener> mOnMarkerClickListeners = new HashMap<String, OnMarkerClickListener>();
private Map<String, OnInfoWindowClickListener> mOnInfoWindowClickListeners = new HashMap<String, OnInfoWindowClickListener>();
private Map<String, OnMarkerDragListener> mOnMarkerDragListeners = new HashMap<String, OnMarkerDragListener>();
/**
* map点击相关监听器集合。
*/
private Set<OnMapClickListener> mOnMapClickListeners = new HashSet<OnMapClickListener>();
private Set<OnMapLongClickListener> mOnMapLongClickListeners = new HashSet<OnMapLongClickListener>();
/**
* 注册监听器 OnMarkerClickListener 到event hub
*
* @param m
* @param l
*/
public void registerOnMarkerClickListener(Marker m, OnMarkerClickListener l) {
if (null != l && null != m) {
Log.i(TAG, "registerOnMarkerClickListener m=" + m.getId());
mOnMarkerClickListeners.put(m.getId(), l);
}
}
/**
* 从event hub取消注册监听器 OnMarkerClickListener
*
* @param m
* @param l
*/
public void unregisterOnMarkerClickListener(Marker m, OnMarkerClickListener l) {
if (null != m) {
mOnMarkerClickListeners.remove(m.getId());
}
}
/**
* 注册监听器 OnInfoWindowClickListener 到event hub
*
* @param m
* @param l
*/
public void registerOnInfoWindowClickListener(Marker m, OnInfoWindowClickListener l) {
if (null != l && null != m) {
mOnInfoWindowClickListeners.put(m.getId(), l);
}
}
/**
* 从event hub取消注册监听器 OnInfoWindowClickListener
*
* @param m
* @param l
*/
public void unregisterOnInfoWindowClickListener(Marker m, OnInfoWindowClickListener l) {
if (null != m) {
mOnInfoWindowClickListeners.remove(m.getId());
}
}
/**
* 注册监听器 OnMarkerDragListener 到event hub
*
* @param m
* @param l
*/
public void registerOnMarkerDragListener(Marker m, OnMarkerDragListener l) {
if (null != l && null != m) {
mOnMarkerDragListeners.put(m.getId(), l);
}
}
/**
* 从event hub取消注册监听器 OnMarkerDragListener
*
* @param m
* @param l
*/
public void unregisterOnMarkerDragListener(Marker m, OnMarkerDragListener l) {
if (null != m) {
mOnMarkerDragListeners.remove(m.getId());
}
}
/**
* 注册监听器 OnMapClickListener 到event hub
*
* @param l
*/
public void registerOnMapClickListener(OnMapClickListener l) {
if (null != l) {
mOnMapClickListeners.add(l);
}
}
/**
* 从event hub取消注册监听器 OnMapClickListener
*
* @param l
*/
public void unregisterOnMapClickListener(OnMapClickListener l) {
if (null != l) {
mOnMapClickListeners.remove(l);
}
}
/**
* 注册监听器 OnMapLongClickListener 到event hub
*
* @param l
*/
public void registerOnMapLongClickListener(OnMapLongClickListener l) {
if (null != l) {
mOnMapLongClickListeners.add(l);
}
}
/**
* 从event hub取消注册监听器 OnMapLongClickListener
*
* @param l
*/
public void unregisterOnMapLongClickListener(OnMapLongClickListener l) {
if (null != l) {
mOnMapLongClickListeners.remove(l);
}
}
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMarkerClickListener#onMarkerClick(com.tencent
* .tencentmap.mapsdk.maps.model.Marker)
*/
@Override
public boolean onMarkerClick(Marker marker) {
Log.i(TAG, "EventHub, onMarkerClick, marker=" + marker.getId());
Iterator<Entry<String, OnMarkerClickListener>> iterator = mOnMarkerClickListeners.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, OnMarkerClickListener> entry = iterator.next();
String key = entry.getKey();
if (null != key && key.equals(marker.getId())) {
OnMarkerClickListener l = entry.getValue();
if (null != l) {
Log.i(TAG, "EventHub, onMarkerClick, null != l");
l.onMarkerClick(marker);
}
}
}
return false;
}
/**
* 临时存放OnInfoWindowClickListener相关的监听器。原因是OnInfoWindowClickListener的事件有两个,但是第二次事件未带marker参数,
* 无法区分到底该派发给哪个监听器。
*/
private ArrayList<OnInfoWindowClickListener> mTmpList4InfoWindowClickEvent = new ArrayList<OnInfoWindowClickListener>();
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnInfoWindowClickListener#onInfoWindowClick
* (com.tencent.tencentmap.mapsdk.maps.model.Marker)
*/
@Override
public void onInfoWindowClick(Marker marker) {
Log.i(TAG, "EventHub, onInfoWindowClick, marker=" + marker.getId());
Iterator<Entry<String, OnInfoWindowClickListener>> iterator = mOnInfoWindowClickListeners.entrySet().iterator();
synchronized (mTmpList4InfoWindowClickEvent) {
while (iterator.hasNext()) {
Entry<String, OnInfoWindowClickListener> entry = iterator.next();
String key = entry.getKey();
if (null != key && key.equals(marker.getId())) {
OnInfoWindowClickListener l = entry.getValue();
if (null != l) {
Log.i(TAG, "EventHub, onInfoWindowClick, null != l");
l.onInfoWindowClick(marker);
mTmpList4InfoWindowClickEvent.add(l);
}
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnInfoWindowClickListener#onInfoWindowClickLocation
* (int, int, int, int)
*/
@Override
public void onInfoWindowClickLocation(int width, int height, int x, int y) {
Log.i(TAG, "EventHub, onInfoWindowClickLocation");
synchronized (mTmpList4InfoWindowClickEvent) {
for (int i = mTmpList4InfoWindowClickEvent.size() - 1; i >= 0; i--) {
mTmpList4InfoWindowClickEvent.get(i).onInfoWindowClickLocation(width, height, x, y);
}
mTmpList4InfoWindowClickEvent.clear();
}
}
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMarkerDragListener#onMarkerDrag(com.tencent
* .tencentmap.mapsdk.maps.model.Marker)
*/
@Override
public void onMarkerDrag(Marker marker) {
Log.i(TAG, "EventHub, onMarkerDrag, marker=" + marker.getId());
Iterator<Entry<String, OnMarkerDragListener>> iterator = mOnMarkerDragListeners.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, OnMarkerDragListener> entry = iterator.next();
String key = entry.getKey();
if (null != key && key.equals(marker.getId())) {
OnMarkerDragListener l = entry.getValue();
if (null != l) {
Log.i(TAG, "EventHub, onMarkerDrag, null != l");
l.onMarkerDrag(marker);
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMarkerDragListener#onMarkerDragEnd(com.tencent
* .tencentmap.mapsdk.maps.model.Marker)
*/
@Override
public void onMarkerDragEnd(Marker marker) {
Log.i(TAG, "EventHub, onMarkerDragEnd, marker=" + marker.getId());
Iterator<Entry<String, OnMarkerDragListener>> iterator = mOnMarkerDragListeners.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, OnMarkerDragListener> entry = iterator.next();
String key = entry.getKey();
if (null != key && key.equals(marker.getId())) {
OnMarkerDragListener l = entry.getValue();
if (null != l) {
Log.i(TAG, "EventHub, onMarkerDragEnd, null != l");
l.onMarkerDragEnd(marker);
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMarkerDragListener#onMarkerDragStart(com.
* tencent.tencentmap.mapsdk.maps.model.Marker)
*/
@Override
public void onMarkerDragStart(Marker marker) {
Log.i(TAG, "EventHub, onMarkerDragStart, marker=" + marker.getId());
Iterator<Entry<String, OnMarkerDragListener>> iterator = mOnMarkerDragListeners.entrySet().iterator();
while (iterator.hasNext()) {
Entry<String, OnMarkerDragListener> entry = iterator.next();
String key = entry.getKey();
if (null != key && key.equals(marker.getId())) {
OnMarkerDragListener l = entry.getValue();
if (null != l) {
Log.i(TAG, "EventHub, onMarkerDragStart, null != l");
l.onMarkerDragEnd(marker);
}
}
}
}
/*
* (non-Javadoc)
*
* @see
* com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMapLongClickListener#onMapLongClick(com.tencent
* .tencentmap.mapsdk.maps.model.LatLng)
*/
@Override
public void onMapLongClick(LatLng latLng) {
Log.i(TAG, "EventHub, onMapLongClick, latLng=" + latLng);
Iterator<OnMapLongClickListener> iterator = mOnMapLongClickListeners.iterator();
while (iterator.hasNext()) {
OnMapLongClickListener l = iterator.next();
if (null != l) {
Log.i(TAG, "EventHub, onMapLongClick, null != l");
l.onMapLongClick(latLng);
}
}
}
/*
* (non-Javadoc)
*
* @see com.tencent.tencentmap.mapsdk.maps.TencentMap.OnMapClickListener#onMapClick(com.tencent.
* tencentmap.mapsdk.maps.model.LatLng)
*/
@Override
public void onMapClick(LatLng latLng) {
Log.i(TAG, "EventHub, onMapClick, latLng=" + latLng);
Iterator<OnMapClickListener> iterator = mOnMapClickListeners.iterator();
while (iterator.hasNext()) {
OnMapClickListener l = iterator.next();
if (null != l) {
Log.i(TAG, "EventHub, onMapClick, null != l");
l.onMapClick(latLng);
}
}
}
/**
* 当EsMapView被destroy时调用,清除所有的监听器
*/
public void clearAll() {
Log.i(TAG, "EventHub, clearAll");
mOnInfoWindowClickListeners.clear();
mOnMarkerClickListeners.clear();
mOnMarkerDragListeners.clear();
mOnMapClickListeners.clear();
mOnMapLongClickListeners.clear();
}
}