- extracted MapEventLayer from TouchHandler
- rename OverlayManager to LayerManager - move event-dispatching from TouchHandler to LayerManager
This commit is contained in:
433
src/org/oscim/view/LayerManager.java
Normal file
433
src/org/oscim/view/LayerManager.java
Normal file
@@ -0,0 +1,433 @@
|
||||
/*
|
||||
* Copyright 2012 osmdroid authors
|
||||
* Copyright 2013 Hannes Janetzek
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
* Foundation, either version 3 of the License, or (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT ANY
|
||||
* WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A
|
||||
* PARTICULAR PURPOSE. See the GNU Lesser General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU Lesser General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.oscim.view;
|
||||
|
||||
import java.util.AbstractList;
|
||||
import java.util.concurrent.CopyOnWriteArrayList;
|
||||
|
||||
import org.oscim.core.MapPosition;
|
||||
import org.oscim.core.PointF;
|
||||
import org.oscim.overlay.Overlay;
|
||||
import org.oscim.overlay.Overlay.Snappable;
|
||||
import org.oscim.renderer.overlays.RenderOverlay;
|
||||
|
||||
import android.content.Context;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.GestureDetector.OnDoubleTapListener;
|
||||
import android.view.GestureDetector.OnGestureListener;
|
||||
import android.view.KeyEvent;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
public class LayerManager extends AbstractList<Overlay> implements OnGestureListener,
|
||||
OnDoubleTapListener {
|
||||
|
||||
private final GestureDetector mGestureDetector;
|
||||
|
||||
private final CopyOnWriteArrayList<Overlay> mOverlayList;
|
||||
|
||||
LayerManager(Context context) {
|
||||
mOverlayList = new CopyOnWriteArrayList<Overlay>();
|
||||
mGestureDetector = new GestureDetector(context, this);
|
||||
mGestureDetector.setOnDoubleTapListener(this);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Overlay get(final int pIndex) {
|
||||
return mOverlayList.get(pIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized int size() {
|
||||
return mOverlayList.size();
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized void add(final int pIndex, final Overlay pElement) {
|
||||
mOverlayList.add(pIndex, pElement);
|
||||
mDirtyOverlays = true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Overlay remove(final int pIndex) {
|
||||
mDirtyOverlays = true;
|
||||
return mOverlayList.remove(pIndex);
|
||||
}
|
||||
|
||||
@Override
|
||||
public synchronized Overlay set(final int pIndex, final Overlay pElement) {
|
||||
mDirtyOverlays = true;
|
||||
return mOverlayList.set(pIndex, pElement);
|
||||
}
|
||||
|
||||
public boolean handleMotionEvent(MotionEvent e) {
|
||||
|
||||
if (mGestureDetector.onTouchEvent(e))
|
||||
return true;
|
||||
|
||||
if (onTouchEvent(e))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
private boolean mDirtyOverlays;
|
||||
private RenderOverlay[] mDrawLayers;
|
||||
|
||||
public RenderOverlay[] getRenderLayers() {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
return mDrawLayers;
|
||||
}
|
||||
|
||||
public void onDetach() {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
o.onDetach();
|
||||
}
|
||||
|
||||
Overlay[] mOverlays;
|
||||
|
||||
private synchronized void updateOverlays() {
|
||||
if (!mDirtyOverlays)
|
||||
return;
|
||||
|
||||
mOverlays = new Overlay[mOverlayList.size()];
|
||||
|
||||
int numRenderLayers = 0;
|
||||
|
||||
for (int i = 0, n = mOverlayList.size(); i < n; i++) {
|
||||
Overlay o = mOverlayList.get(i);
|
||||
if (o.getLayer() != null)
|
||||
numRenderLayers++;
|
||||
|
||||
mOverlays[n - i - 1] = o;
|
||||
}
|
||||
|
||||
mDrawLayers = new RenderOverlay[numRenderLayers];
|
||||
|
||||
for (int i = 0, cnt = 0, n = mOverlayList.size(); i < n; i++) {
|
||||
Overlay o = mOverlayList.get(i);
|
||||
RenderOverlay l = o.getLayer();
|
||||
if (l != null)
|
||||
mDrawLayers[cnt++] = l;
|
||||
}
|
||||
|
||||
mDirtyOverlays = false;
|
||||
}
|
||||
|
||||
public boolean onTouchEvent(final MotionEvent event) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onTouchEvent(event))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean onKeyDown(final int keyCode, final KeyEvent event) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onKeyDown(keyCode, event))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean onKeyUp(final int keyCode, final KeyEvent event) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onKeyUp(keyCode, event))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean onTrackballEvent(final MotionEvent event) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onTrackballEvent(event))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public boolean onSnapToItem(final int x, final int y, final PointF snapPoint) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o instanceof Snappable)
|
||||
if (((Snappable) o).onSnapToItem(x, y, snapPoint))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* GestureDetector.OnDoubleTapListener */
|
||||
|
||||
@Override
|
||||
public boolean onDoubleTap(final MotionEvent e) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onDoubleTap(e))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDoubleTapEvent(final MotionEvent e) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onDoubleTapEvent(e))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSingleTapConfirmed(final MotionEvent e) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onSingleTapConfirmed(e))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
/* OnGestureListener */
|
||||
|
||||
@Override
|
||||
public boolean onDown(final MotionEvent pEvent) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onDown(pEvent))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onFling(final MotionEvent pEvent1, final MotionEvent pEvent2,
|
||||
final float pVelocityX, final float pVelocityY) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onFling(pEvent1, pEvent2, pVelocityX, pVelocityY))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLongPress(final MotionEvent pEvent) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onLongPress(pEvent))
|
||||
return;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onScroll(final MotionEvent pEvent1, final MotionEvent pEvent2,
|
||||
final float pDistanceX, final float pDistanceY) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onScroll(pEvent1, pEvent2, pDistanceX, pDistanceY))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onShowPress(final MotionEvent pEvent) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
o.onShowPress(pEvent);
|
||||
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSingleTapUp(final MotionEvent pEvent) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
if (o.onSingleTapUp(pEvent))
|
||||
return true;
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public void onUpdate(MapPosition mapPosition, boolean changed) {
|
||||
if (mDirtyOverlays)
|
||||
updateOverlays();
|
||||
|
||||
for (Overlay o : mOverlays)
|
||||
o.onUpdate(mapPosition, changed);
|
||||
}
|
||||
|
||||
// /**
|
||||
// * Gets the optional TilesOverlay class.
|
||||
// *
|
||||
// * @return the tilesOverlay
|
||||
// */
|
||||
// public TilesOverlay getTilesOverlay() {
|
||||
// return mTilesOverlay;
|
||||
// }
|
||||
//
|
||||
// /**
|
||||
// * Sets the optional TilesOverlay class. If set, this overlay will be
|
||||
// drawn before all other
|
||||
// * overlays and will not be included in the editable list of overlays and
|
||||
// can't be cleared
|
||||
// * except by a subsequent call to setTilesOverlay().
|
||||
// *
|
||||
// * @param tilesOverlay
|
||||
// * the tilesOverlay to set
|
||||
// */
|
||||
// public void setTilesOverlay(final TilesOverlay tilesOverlay) {
|
||||
// mTilesOverlay = tilesOverlay;
|
||||
// }
|
||||
|
||||
// public void onDraw(final Canvas c, final MapView pMapView) {
|
||||
// // if ((mTilesOverlay != null) && mTilesOverlay.isEnabled()) {
|
||||
// // mTilesOverlay.draw(c, pMapView, true);
|
||||
// // }
|
||||
// //
|
||||
// // if ((mTilesOverlay != null) && mTilesOverlay.isEnabled()) {
|
||||
// // mTilesOverlay.draw(c, pMapView, false);
|
||||
// // }
|
||||
//
|
||||
// for (final Overlay overlay : mOverlayList) {
|
||||
// if (overlay.isEnabled()) {
|
||||
// overlay.draw(c, pMapView, true);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// for (final Overlay overlay : mOverlayList) {
|
||||
// if (overlay.isEnabled()) {
|
||||
// overlay.draw(c, pMapView, false);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// }
|
||||
|
||||
// ** Options Menu **//
|
||||
|
||||
// public void setOptionsMenusEnabled(final boolean pEnabled) {
|
||||
// for (final Overlay overlay : mOverlayList) {
|
||||
// if ((overlay instanceof IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()) {
|
||||
// ((IOverlayMenuProvider) overlay).setOptionsMenuEnabled(pEnabled);
|
||||
// }
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// public boolean onCreateOptionsMenu(final Menu pMenu, final int
|
||||
// menuIdOffset,
|
||||
// final MapView mapView) {
|
||||
// boolean result = true;
|
||||
// for (final Overlay overlay : this.overlaysReversed()) {
|
||||
// if ((overlay instanceof IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()) {
|
||||
// result &= ((IOverlayMenuProvider) overlay).onCreateOptionsMenu(pMenu,
|
||||
// menuIdOffset,
|
||||
// mapView);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if ((mTilesOverlay != null) && (mTilesOverlay instanceof
|
||||
// IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) mTilesOverlay).isOptionsMenuEnabled()) {
|
||||
// result &= mTilesOverlay.onCreateOptionsMenu(pMenu, menuIdOffset,
|
||||
// mapView);
|
||||
// }
|
||||
//
|
||||
// return result;
|
||||
// }
|
||||
//
|
||||
// public boolean onPrepareOptionsMenu(final Menu pMenu, final int
|
||||
// menuIdOffset,
|
||||
// final MapView mapView) {
|
||||
// for (final Overlay overlay : this.overlaysReversed()) {
|
||||
// if ((overlay instanceof IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()) {
|
||||
// ((IOverlayMenuProvider) overlay).onPrepareOptionsMenu(pMenu,
|
||||
// menuIdOffset, mapView);
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if ((mTilesOverlay != null) && (mTilesOverlay instanceof
|
||||
// IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) mTilesOverlay).isOptionsMenuEnabled()) {
|
||||
// mTilesOverlay.onPrepareOptionsMenu(pMenu, menuIdOffset, mapView);
|
||||
// }
|
||||
//
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// public boolean onOptionsItemSelected(final MenuItem item, final int
|
||||
// menuIdOffset,
|
||||
// final MapView mapView) {
|
||||
// for (final Overlay overlay : this.overlaysReversed()) {
|
||||
// if ((overlay instanceof IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) overlay).isOptionsMenuEnabled()
|
||||
// && ((IOverlayMenuProvider) overlay).onOptionsItemSelected(item,
|
||||
// menuIdOffset,
|
||||
// mapView)) {
|
||||
// return true;
|
||||
// }
|
||||
// }
|
||||
//
|
||||
// if ((mTilesOverlay != null)
|
||||
// && (mTilesOverlay instanceof IOverlayMenuProvider)
|
||||
// && ((IOverlayMenuProvider) mTilesOverlay).isOptionsMenuEnabled()
|
||||
// && ((IOverlayMenuProvider) mTilesOverlay).onOptionsItemSelected(item,
|
||||
// menuIdOffset,
|
||||
// mapView)) {
|
||||
// return true;
|
||||
// }
|
||||
//
|
||||
// return false;
|
||||
// }
|
||||
}
|
||||
@@ -1,6 +1,5 @@
|
||||
/*
|
||||
* Copyright 2010, 2011, 2012 mapsforge.org
|
||||
* Copyright 2012, 2013 Hannes Janetzek
|
||||
* Copyright 2013 Hannes Janetzek
|
||||
*
|
||||
* This program is free software: you can redistribute it and/or modify it under the
|
||||
* terms of the GNU Lesser General Public License as published by the Free Software
|
||||
@@ -13,35 +12,24 @@
|
||||
* You should have received a copy of the GNU Lesser General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
package org.oscim.view;
|
||||
|
||||
import org.oscim.core.Tile;
|
||||
import org.oscim.overlay.OverlayManager;
|
||||
import org.oscim.overlay.Overlay;
|
||||
|
||||
import android.content.Context;
|
||||
import android.util.Log;
|
||||
import android.view.GestureDetector;
|
||||
import android.view.GestureDetector.OnDoubleTapListener;
|
||||
import android.view.GestureDetector.OnGestureListener;
|
||||
import android.view.MotionEvent;
|
||||
|
||||
/**
|
||||
* @author Hannes Janetzek
|
||||
* Changes MapViewPosition for scroll, fling, scale, rotation and tilt gestures
|
||||
*
|
||||
* @TODO:
|
||||
* - use one AnimationTimer instead of CountDownTimers
|
||||
* - fix recognition of tilt/rotate/scale state...
|
||||
* - better recognition of tilt/rotate/scale state
|
||||
*/
|
||||
|
||||
final class TouchHandler implements OnGestureListener, OnDoubleTapListener {
|
||||
|
||||
private static final String TAG = TouchHandler.class.getName();
|
||||
|
||||
public class MapEventLayer extends Overlay {
|
||||
private static final boolean debug = false;
|
||||
|
||||
private final MapView mMapView;
|
||||
private final MapViewPosition mMapPosition;
|
||||
private final OverlayManager mOverlayManager;
|
||||
private static final String TAG = MapEventLayer.class.getName();
|
||||
|
||||
private float mSumScale;
|
||||
private float mSumRotate;
|
||||
@@ -63,58 +51,55 @@ final class TouchHandler implements OnGestureListener, OnDoubleTapListener {
|
||||
private float mFocusX;
|
||||
private float mFocusY;
|
||||
|
||||
private final GestureDetector mGestureDetector;
|
||||
|
||||
protected static final int JUMP_THRESHOLD = 100;
|
||||
protected static final double PINCH_ZOOM_THRESHOLD = 5;
|
||||
protected static final double PINCH_ROTATE_THRESHOLD = 0.02;
|
||||
protected static final float PINCH_TILT_THRESHOLD = 1f;
|
||||
|
||||
/**
|
||||
* @param context
|
||||
* the Context
|
||||
* @param mapView
|
||||
* the MapView
|
||||
*/
|
||||
public TouchHandler(Context context, MapView mapView) {
|
||||
mMapView = mapView;
|
||||
private final MapViewPosition mMapPosition;
|
||||
|
||||
public MapEventLayer(MapView mapView) {
|
||||
super(mapView);
|
||||
mMapPosition = mapView.getMapViewPosition();
|
||||
mOverlayManager = mapView.getOverlayManager();
|
||||
mGestureDetector = new GestureDetector(context, this);
|
||||
mGestureDetector.setOnDoubleTapListener(this);
|
||||
}
|
||||
|
||||
/**
|
||||
* @param e
|
||||
* ...
|
||||
* @return ...
|
||||
*/
|
||||
public boolean handleMotionEvent(MotionEvent e) {
|
||||
|
||||
if (mOverlayManager.onTouchEvent(e))
|
||||
return true;
|
||||
|
||||
mGestureDetector.onTouchEvent(e);
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent e) {
|
||||
|
||||
int action = getAction(e);
|
||||
|
||||
if (action == MotionEvent.ACTION_DOWN) {
|
||||
mMulti = 0;
|
||||
mWasMulti = false;
|
||||
if (mOverlayManager.onDown(e))
|
||||
return true;
|
||||
|
||||
return onActionDown(e);
|
||||
mPrevX = e.getX(0);
|
||||
mPrevY = e.getY(0);
|
||||
return true; //onActionDown(e);
|
||||
} else if (action == MotionEvent.ACTION_MOVE) {
|
||||
return onActionMove(e);
|
||||
} else if (action == MotionEvent.ACTION_UP) {
|
||||
return onActionUp(e);
|
||||
mBeginRotate = false;
|
||||
mBeginTilt = false;
|
||||
mBeginScale = false;
|
||||
mDoubleTap = false;
|
||||
return true;
|
||||
//return onActionUp(e);
|
||||
|
||||
} else if (action == MotionEvent.ACTION_CANCEL) {
|
||||
return onActionCancel();
|
||||
mDoubleTap = false;
|
||||
return true;
|
||||
//return onActionCancel();
|
||||
} else if (action == MotionEvent.ACTION_POINTER_DOWN) {
|
||||
return onActionPointerDown(e);
|
||||
mMulti++;
|
||||
mWasMulti = true;
|
||||
|
||||
updateMulti(e);
|
||||
return true;
|
||||
//return onActionPointerDown(e);
|
||||
} else if (action == MotionEvent.ACTION_POINTER_UP) {
|
||||
return onActionPointerUp(e);
|
||||
updateMulti(e);
|
||||
mMulti--;
|
||||
return true;
|
||||
//return onActionPointerUp(e);
|
||||
}
|
||||
|
||||
return false;
|
||||
@@ -124,11 +109,6 @@ final class TouchHandler implements OnGestureListener, OnDoubleTapListener {
|
||||
return e.getAction() & MotionEvent.ACTION_MASK;
|
||||
}
|
||||
|
||||
private boolean onActionCancel() {
|
||||
mDoubleTap = false;
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean onActionMove(MotionEvent e) {
|
||||
float x1 = e.getX(0);
|
||||
float y1 = e.getY(0);
|
||||
@@ -279,80 +259,14 @@ final class TouchHandler implements OnGestureListener, OnDoubleTapListener {
|
||||
}
|
||||
}
|
||||
|
||||
private boolean onActionPointerDown(MotionEvent e) {
|
||||
@Override
|
||||
public boolean onDoubleTap(MotionEvent e) {
|
||||
|
||||
mMulti++;
|
||||
mWasMulti = true;
|
||||
|
||||
updateMulti(e);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private boolean onActionPointerUp(MotionEvent e) {
|
||||
|
||||
updateMulti(e);
|
||||
mMulti--;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
private void printState(String action) {
|
||||
Log.d(TAG, action
|
||||
+ " " + mDoubleTap
|
||||
+ " " + mBeginScale
|
||||
+ " " + mBeginRotate
|
||||
+ " " + mBeginTilt);
|
||||
}
|
||||
|
||||
private boolean onActionDown(MotionEvent e) {
|
||||
mPrevX = e.getX(0);
|
||||
mPrevY = e.getY(0);
|
||||
mDoubleTap = true;
|
||||
//mMapPosition.animateZoom(2);
|
||||
|
||||
if (debug)
|
||||
printState("onActionDown");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param event
|
||||
* unused
|
||||
* @return ...
|
||||
*/
|
||||
private boolean onActionUp(MotionEvent event) {
|
||||
|
||||
if (debug)
|
||||
printState("onActionUp");
|
||||
|
||||
mBeginRotate = false;
|
||||
mBeginTilt = false;
|
||||
mBeginScale = false;
|
||||
mDoubleTap = false;
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/******************* GestureListener *******************/
|
||||
|
||||
//private final Scroller mScroller;
|
||||
//private float mScrollX, mScrollY;
|
||||
// private boolean fling = false;
|
||||
|
||||
@Override
|
||||
public void onShowPress(MotionEvent e) {
|
||||
mOverlayManager.onShowPress(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onSingleTapUp(MotionEvent e) {
|
||||
return mOverlayManager.onSingleTapUp(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDown(MotionEvent e) {
|
||||
if (debug)
|
||||
printState("onDown");
|
||||
printState("onDoubleTap");
|
||||
|
||||
return true;
|
||||
}
|
||||
@@ -361,18 +275,15 @@ final class TouchHandler implements OnGestureListener, OnDoubleTapListener {
|
||||
public boolean onScroll(final MotionEvent e1, final MotionEvent e2, final float distanceX,
|
||||
final float distanceY) {
|
||||
|
||||
if (mOverlayManager.onScroll(e1, e2, distanceX, distanceY)) {
|
||||
return true;
|
||||
}
|
||||
|
||||
if (mMulti == 0) {
|
||||
if (debug)
|
||||
printState("onScroll " + distanceX + " " + distanceY);
|
||||
mMapPosition.moveMap(-distanceX, -distanceY);
|
||||
mMapView.redrawMap(true);
|
||||
return true;
|
||||
}
|
||||
|
||||
return true;
|
||||
return false;
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -402,47 +313,16 @@ final class TouchHandler implements OnGestureListener, OnDoubleTapListener {
|
||||
mMapPosition.animateFling(
|
||||
Math.round(velocityX * s),
|
||||
Math.round(velocityY * s),
|
||||
-w, w, -h, h);
|
||||
-w, w, -h, h);
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public void onLongPress(MotionEvent e) {
|
||||
if (mDoubleTap)
|
||||
return;
|
||||
|
||||
if (mOverlayManager.onLongPress(e)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// if (MapView.testRegionZoom) {
|
||||
// Log.d("mapsforge", "long press");
|
||||
// mMapView.mRegionLookup.updateRegion(-1, null);
|
||||
// }
|
||||
private void printState(String action) {
|
||||
Log.d(TAG, action
|
||||
+ " " + mDoubleTap
|
||||
+ " " + mBeginScale
|
||||
+ " " + mBeginRotate
|
||||
+ " " + mBeginTilt);
|
||||
}
|
||||
|
||||
/******************* DoubleTapListener ****************/
|
||||
@Override
|
||||
public boolean onSingleTapConfirmed(MotionEvent e) {
|
||||
return mOverlayManager.onSingleTapConfirmed(e);
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDoubleTap(MotionEvent e) {
|
||||
if (mOverlayManager.onDoubleTap(e))
|
||||
return true;
|
||||
|
||||
mDoubleTap = true;
|
||||
//mMapPosition.animateZoom(2);
|
||||
|
||||
if (debug)
|
||||
printState("onDoubleTap");
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
@Override
|
||||
public boolean onDoubleTapEvent(MotionEvent e) {
|
||||
return false;
|
||||
}
|
||||
}
|
||||
@@ -40,7 +40,6 @@ import org.oscim.generator.TileGenerator;
|
||||
import org.oscim.overlay.BuildingOverlay;
|
||||
import org.oscim.overlay.LabelingOverlay;
|
||||
import org.oscim.overlay.Overlay;
|
||||
import org.oscim.overlay.OverlayManager;
|
||||
import org.oscim.renderer.GLRenderer;
|
||||
import org.oscim.renderer.GLView;
|
||||
import org.oscim.renderer.TileManager;
|
||||
@@ -80,11 +79,10 @@ public class MapView extends RelativeLayout {
|
||||
|
||||
//private final MapZoomControls mMapZoomControls;
|
||||
|
||||
private final TouchHandler mTouchEventHandler;
|
||||
private final Compass mCompass;
|
||||
|
||||
private final TileManager mTileManager;
|
||||
private final OverlayManager mOverlayManager;
|
||||
private final LayerManager mLayerManager;
|
||||
|
||||
final GLView mGLView;
|
||||
private final JobQueue mJobQueue;
|
||||
@@ -150,9 +148,7 @@ public class MapView extends RelativeLayout {
|
||||
mMapViewPosition = new MapViewPosition(this);
|
||||
mMapPosition = new MapPosition();
|
||||
|
||||
mOverlayManager = new OverlayManager();
|
||||
|
||||
mTouchEventHandler = new TouchHandler(mapActivity, this);
|
||||
mLayerManager = new LayerManager(context);
|
||||
|
||||
mCompass = new Compass(mapActivity, this);
|
||||
|
||||
@@ -180,25 +176,29 @@ public class MapView extends RelativeLayout {
|
||||
|
||||
addView(mGLView, params);
|
||||
|
||||
mLayerManager.add(new MapEventLayer(this));
|
||||
|
||||
//mMapZoomControls = new MapZoomControls(mapActivity, this);
|
||||
//mMapZoomControls.setShowMapZoomControls(true);
|
||||
mRotationEnabled = true;
|
||||
|
||||
//mOverlayManager.add(new GenericOverlay(this, new GridOverlay(this)));
|
||||
//mLayerManager.add(new GenericOverlay(this, new GridOverlay(this)));
|
||||
|
||||
mOverlayManager.add(new BuildingOverlay(this));
|
||||
mOverlayManager.add(new LabelingOverlay(this));
|
||||
mLayerManager.add(new BuildingOverlay(this));
|
||||
mLayerManager.add(new LabelingOverlay(this));
|
||||
|
||||
//mOverlayManager.add(new GenericOverlay(this, new TileOverlay(this)));
|
||||
//mOverlayManager.add(new GenericOverlay(this, new CustomOverlay(this)));
|
||||
//mOverlayManager.add(new MapLensOverlay(this));
|
||||
//mLayerManager.add(new GenericOverlay(this, new TileOverlay(this)));
|
||||
//mLayerManager.add(new GenericOverlay(this, new CustomOverlay(this)));
|
||||
//mLayerManager.add(new MapLensOverlay(this));
|
||||
|
||||
//PathOverlay path = new PathOverlay(this, Color.RED);
|
||||
//path.addGreatCircle(new GeoPoint(53.1, 8.8), new GeoPoint(53.1, -110.0));
|
||||
//mOverlayManager.add(path);
|
||||
//mLayerManager.add(path);
|
||||
//path = new PathOverlay(this, Color.GREEN);
|
||||
//path.addGreatCircle(new GeoPoint(53.1, 140), new GeoPoint(53.1, -110.0));
|
||||
//mOverlayManager.add(path);
|
||||
//mLayerManager.add(path);
|
||||
|
||||
//mLayerManager.add(new GenericOverlay(this, new AtlasTest(this)));
|
||||
|
||||
clearMap();
|
||||
}
|
||||
@@ -218,7 +218,6 @@ public class MapView extends RelativeLayout {
|
||||
// restore the interrupted status
|
||||
Thread.currentThread().interrupt();
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
@@ -253,13 +252,11 @@ public class MapView extends RelativeLayout {
|
||||
|
||||
@Override
|
||||
public boolean onTouchEvent(MotionEvent motionEvent) {
|
||||
// mMapZoomControlsjonMapViewTouchEvent(motionEvent.getAction()
|
||||
// & MotionEvent.ACTION_MASK);
|
||||
|
||||
if (this.isClickable())
|
||||
return mTouchEventHandler.handleMotionEvent(motionEvent);
|
||||
if (!isClickable())
|
||||
return false;
|
||||
|
||||
return false;
|
||||
return mLayerManager.handleMotionEvent(motionEvent);
|
||||
}
|
||||
|
||||
@Override
|
||||
@@ -344,7 +341,7 @@ public class MapView extends RelativeLayout {
|
||||
|
||||
// required when not changed?
|
||||
if (AndroidUtils.currentThreadIsUiThread())
|
||||
mOverlayManager.onUpdate(mMapPosition, changed);
|
||||
mLayerManager.onUpdate(mMapPosition, changed);
|
||||
|
||||
if (changed) {
|
||||
mTileManager.update(mMapPosition);
|
||||
@@ -620,8 +617,8 @@ public class MapView extends RelativeLayout {
|
||||
return this.getOverlayManager();
|
||||
}
|
||||
|
||||
public OverlayManager getOverlayManager() {
|
||||
return mOverlayManager;
|
||||
public LayerManager getOverlayManager() {
|
||||
return mLayerManager;
|
||||
}
|
||||
|
||||
public TileManager getTileManager() {
|
||||
|
||||
Reference in New Issue
Block a user