use arrays for listeners (avoid allocating iterators)
This commit is contained in:
parent
828c6d9212
commit
bfb86e0a57
vtm/src/org/oscim/map
@ -58,8 +58,8 @@ public final class Layers extends AbstractList<Layer> {
|
||||
|
||||
if (layer instanceof UpdateListener)
|
||||
mMap.bind((UpdateListener) layer);
|
||||
//if (layer instanceof InputListener)
|
||||
// mMap.bind((InputListener) layer);
|
||||
if (layer instanceof InputListener)
|
||||
mMap.bind((InputListener) layer);
|
||||
|
||||
mLayerList.add(index, layer);
|
||||
mDirtyLayers = true;
|
||||
@ -73,8 +73,8 @@ public final class Layers extends AbstractList<Layer> {
|
||||
|
||||
if (remove instanceof UpdateListener)
|
||||
mMap.unbind((UpdateListener) remove);
|
||||
//if (remove instanceof InputListener)
|
||||
// mMap.unbind((InputListener) remove);
|
||||
if (remove instanceof InputListener)
|
||||
mMap.unbind((InputListener) remove);
|
||||
|
||||
return remove;
|
||||
}
|
||||
@ -90,8 +90,8 @@ public final class Layers extends AbstractList<Layer> {
|
||||
// unbind replaced layer
|
||||
if (remove instanceof UpdateListener)
|
||||
mMap.unbind((UpdateListener) remove);
|
||||
//if (remove instanceof InputListener)
|
||||
// mMap.unbind((InputListener) remove);
|
||||
if (remove instanceof InputListener)
|
||||
mMap.unbind((InputListener) remove);
|
||||
|
||||
return remove;
|
||||
}
|
||||
@ -114,8 +114,6 @@ public final class Layers extends AbstractList<Layer> {
|
||||
|
||||
for (Layer o : mLayers)
|
||||
o.onDetach();
|
||||
|
||||
// TODO need to clear lists here?
|
||||
}
|
||||
|
||||
boolean handleGesture(Gesture g, MotionEvent e) {
|
||||
@ -130,15 +128,6 @@ public final class Layers extends AbstractList<Layer> {
|
||||
return false;
|
||||
}
|
||||
|
||||
void handleMotionEvent(MotionEvent e) {
|
||||
if (mDirtyLayers)
|
||||
updateLayers();
|
||||
|
||||
for (Layer o : mLayers)
|
||||
if (o instanceof InputListener)
|
||||
((InputListener) o).onMotionEvent(e);
|
||||
}
|
||||
|
||||
private synchronized void updateLayers() {
|
||||
mLayers = new Layer[mLayerList.size()];
|
||||
int numRenderLayers = 0;
|
||||
|
@ -74,11 +74,13 @@ public abstract class Map {
|
||||
|
||||
private VectorTileLayer mBaseLayer;
|
||||
|
||||
private Set<InputListener> mInputListeners = new LinkedHashSet<InputListener>();
|
||||
private Set<UpdateListener> mUpdateListeners = new LinkedHashSet<UpdateListener>();
|
||||
private Set<InputListener> mInputListenerSet = new LinkedHashSet<InputListener>();
|
||||
private InputListener[] mInputListeners;
|
||||
|
||||
private Set<UpdateListener> mUpdateListenerSet = new LinkedHashSet<UpdateListener>();
|
||||
private UpdateListener[] mUpdateListeners;
|
||||
|
||||
public Map() {
|
||||
|
||||
mViewport = new Viewport(this);
|
||||
mAnimator = new MapAnimator(this, mViewport);
|
||||
|
||||
@ -88,8 +90,6 @@ public abstract class Map {
|
||||
|
||||
mEventLayer = new MapEventLayer(this);
|
||||
mLayers.add(0, mEventLayer);
|
||||
|
||||
//mGestureDetector = new GestureDetector(this, mLayers);
|
||||
}
|
||||
|
||||
public MapEventLayer getEventLayer() {
|
||||
@ -200,22 +200,6 @@ public abstract class Map {
|
||||
mClearMap = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is run on main-loop before rendering a frame.
|
||||
* Caution: Do not call directly!
|
||||
*/
|
||||
protected void updateLayers() {
|
||||
boolean changed = false;
|
||||
|
||||
// get the current MapPosition
|
||||
changed |= mViewport.getMapPosition(mMapPosition);
|
||||
|
||||
for (UpdateListener l : mUpdateListeners)
|
||||
l.onMapUpdate(mMapPosition, changed, mClearMap);
|
||||
|
||||
mClearMap = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set {@link MapPosition} of {@link Viewport} and trigger a redraw.
|
||||
*/
|
||||
@ -262,37 +246,65 @@ public abstract class Map {
|
||||
return mAnimator;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register InputListener
|
||||
*/
|
||||
public void bind(InputListener listener) {
|
||||
mInputListeners.add(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister InputListener
|
||||
*/
|
||||
public void unbind(InputListener listener) {
|
||||
mInputListeners.remove(listener);
|
||||
}
|
||||
|
||||
/**
|
||||
* Register UpdateListener
|
||||
*/
|
||||
public void bind(UpdateListener l) {
|
||||
mUpdateListeners.add(l);
|
||||
if (mUpdateListenerSet.add(l))
|
||||
mUpdateListeners = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister UpdateListener
|
||||
*/
|
||||
public void unbind(UpdateListener l) {
|
||||
mUpdateListeners.remove(l);
|
||||
if (mUpdateListenerSet.remove(l))
|
||||
mUpdateListeners = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* This function is run on main-loop before rendering a frame.
|
||||
* Caution: Do not call directly!
|
||||
*/
|
||||
protected void updateLayers() {
|
||||
boolean changed = false;
|
||||
|
||||
// get the current MapPosition
|
||||
changed |= mViewport.getMapPosition(mMapPosition);
|
||||
|
||||
if (mUpdateListeners == null) {
|
||||
mUpdateListeners = new UpdateListener[mUpdateListenerSet.size()];
|
||||
mUpdateListenerSet.toArray(mUpdateListeners);
|
||||
}
|
||||
|
||||
for (UpdateListener l : mUpdateListeners)
|
||||
l.onMapUpdate(mMapPosition, changed, mClearMap);
|
||||
|
||||
mClearMap = false;
|
||||
}
|
||||
|
||||
/**
|
||||
* Register InputListener
|
||||
*/
|
||||
public void bind(InputListener listener) {
|
||||
if (mInputListenerSet.add(listener))
|
||||
mInputListeners = null;
|
||||
}
|
||||
|
||||
/**
|
||||
* Unregister InputListener
|
||||
*/
|
||||
public void unbind(InputListener listener) {
|
||||
if (mInputListenerSet.remove(listener))
|
||||
mInputListeners = null;
|
||||
}
|
||||
|
||||
// TODO make protected
|
||||
public void handleMotionEvent(MotionEvent e) {
|
||||
mLayers.handleMotionEvent(e);
|
||||
|
||||
if (mInputListeners == null) {
|
||||
mInputListeners = new InputListener[mInputListenerSet.size()];
|
||||
mInputListenerSet.toArray(mInputListeners);
|
||||
}
|
||||
|
||||
for (InputListener l : mInputListeners)
|
||||
l.onMotionEvent(e);
|
||||
|
Loading…
x
Reference in New Issue
Block a user