some event mechanism
This commit is contained in:
parent
5389f59df0
commit
4e01de31f7
@ -219,7 +219,7 @@ public class MapView extends RelativeLayout {
|
|||||||
mPausing = false;
|
mPausing = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
AndroidMotionEvent mMotionEvent = new AndroidMotionEvent();
|
AndroidMotionEvent mMotionEvent = new AndroidMotionEvent(this);
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public boolean onTouchEvent(android.view.MotionEvent motionEvent) {
|
public boolean onTouchEvent(android.view.MotionEvent motionEvent) {
|
||||||
@ -228,8 +228,9 @@ public class MapView extends RelativeLayout {
|
|||||||
return false;
|
return false;
|
||||||
|
|
||||||
mMotionEvent.wrap(motionEvent);
|
mMotionEvent.wrap(motionEvent);
|
||||||
|
mMap.handleMotionEvent(mMotionEvent);
|
||||||
|
|
||||||
return mMap.getLayers().handleMotionEvent(mMotionEvent);
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
// synchronized ???
|
// synchronized ???
|
||||||
|
@ -13,10 +13,19 @@
|
|||||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package org.oscim.android.input;
|
package org.oscim.android.input;
|
||||||
import org.oscim.backend.input.MotionEvent;
|
import org.oscim.event.MotionEvent;
|
||||||
|
|
||||||
public class AndroidMotionEvent extends MotionEvent {
|
public class AndroidMotionEvent extends MotionEvent {
|
||||||
|
|
||||||
|
/**
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public AndroidMotionEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
android.view.MotionEvent mEvent;
|
android.view.MotionEvent mEvent;
|
||||||
|
|
||||||
public void wrap(android.view.MotionEvent e){
|
public void wrap(android.view.MotionEvent e){
|
||||||
|
@ -19,6 +19,8 @@ import java.net.URL;
|
|||||||
import org.oscim.backend.canvas.Bitmap;
|
import org.oscim.backend.canvas.Bitmap;
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.core.MapPosition;
|
||||||
import org.oscim.core.Tile;
|
import org.oscim.core.Tile;
|
||||||
|
import org.oscim.event.MapEvent;
|
||||||
|
import org.oscim.event.UpdateEvent;
|
||||||
import org.oscim.gdx.client.GwtBitmap;
|
import org.oscim.gdx.client.GwtBitmap;
|
||||||
import org.oscim.layers.tile.TileLayer;
|
import org.oscim.layers.tile.TileLayer;
|
||||||
import org.oscim.layers.tile.bitmap.TileSource.FadeStep;
|
import org.oscim.layers.tile.bitmap.TileSource.FadeStep;
|
||||||
@ -48,33 +50,66 @@ public class BitmapTileLayer extends TileLayer<TileLoader> {
|
|||||||
mFade = mTileSource.getFadeSteps();
|
mFade = mTileSource.getFadeSteps();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public void onUpdate(MapPosition pos, boolean changed, boolean clear) {
|
||||||
|
// super.onUpdate(pos, changed, clear);
|
||||||
|
//
|
||||||
|
// if (mFade == null) {
|
||||||
|
// mRenderLayer.setBitmapAlpha(1);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// float alpha = 0;
|
||||||
|
// for (FadeStep f : mFade) {
|
||||||
|
// if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd)
|
||||||
|
// continue;
|
||||||
|
//
|
||||||
|
// if (f.alphaStart == f.alphaEnd) {
|
||||||
|
// alpha = f.alphaStart;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// double range = f.scaleEnd / f.scaleStart;
|
||||||
|
// float a = (float)((range - (pos.scale / f.scaleStart)) / range);
|
||||||
|
// a = FastMath.clamp(a, 0, 1);
|
||||||
|
// // interpolate alpha between start and end
|
||||||
|
// alpha = a * f.alphaStart + (1 - a) * f.alphaEnd;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// mRenderLayer.setBitmapAlpha(alpha);
|
||||||
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(MapPosition pos, boolean changed, boolean clear) {
|
public void handleEvent(MapEvent event) {
|
||||||
super.onUpdate(pos, changed, clear);
|
super.handleEvent(event);
|
||||||
|
|
||||||
if (mFade == null) {
|
if (event instanceof UpdateEvent) {
|
||||||
mRenderLayer.setBitmapAlpha(1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
float alpha = 0;
|
if (mFade == null) {
|
||||||
for (FadeStep f : mFade) {
|
mRenderLayer.setBitmapAlpha(1);
|
||||||
if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd)
|
return;
|
||||||
continue;
|
}
|
||||||
|
MapPosition pos = mMap.getMapPosition();
|
||||||
|
|
||||||
if (f.alphaStart == f.alphaEnd) {
|
float alpha = 0;
|
||||||
alpha = f.alphaStart;
|
for (FadeStep f : mFade) {
|
||||||
|
if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (f.alphaStart == f.alphaEnd) {
|
||||||
|
alpha = f.alphaStart;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
double range = f.scaleEnd / f.scaleStart;
|
||||||
|
float a = (float) ((range - (pos.scale / f.scaleStart)) / range);
|
||||||
|
a = FastMath.clamp(a, 0, 1);
|
||||||
|
// interpolate alpha between start and end
|
||||||
|
alpha = a * f.alphaStart + (1 - a) * f.alphaEnd;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
double range = f.scaleEnd / f.scaleStart;
|
|
||||||
float a = (float)((range - (pos.scale / f.scaleStart)) / range);
|
|
||||||
a = FastMath.clamp(a, 0, 1);
|
|
||||||
// interpolate alpha between start and end
|
|
||||||
alpha = a * f.alphaStart + (1 - a) * f.alphaEnd;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRenderLayer.setBitmapAlpha(alpha);
|
mRenderLayer.setBitmapAlpha(alpha);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -1,12 +1,17 @@
|
|||||||
package org.oscim.gdx;
|
package org.oscim.gdx;
|
||||||
|
|
||||||
import org.oscim.backend.input.MotionEvent;
|
import org.oscim.event.MotionEvent;
|
||||||
|
|
||||||
import com.badlogic.gdx.Gdx;
|
|
||||||
import com.badlogic.gdx.InputProcessor;
|
import com.badlogic.gdx.InputProcessor;
|
||||||
|
|
||||||
public class GdxMotionEvent extends MotionEvent implements InputProcessor{
|
public class GdxMotionEvent extends MotionEvent implements InputProcessor{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public GdxMotionEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public int getAction() {
|
public int getAction() {
|
||||||
return 0;
|
return 0;
|
||||||
|
7
vtm/src/org/oscim/event/EventDispatcher.java
Normal file
7
vtm/src/org/oscim/event/EventDispatcher.java
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
package org.oscim.event;
|
||||||
|
|
||||||
|
public interface EventDispatcher {
|
||||||
|
|
||||||
|
public void addListener(String type, EventListener listener);
|
||||||
|
public void removeListener(String type, EventListener listener);
|
||||||
|
}
|
5
vtm/src/org/oscim/event/EventListener.java
Normal file
5
vtm/src/org/oscim/event/EventListener.java
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
package org.oscim.event;
|
||||||
|
|
||||||
|
public interface EventListener {
|
||||||
|
public void handleEvent(MapEvent event);
|
||||||
|
}
|
@ -12,8 +12,14 @@
|
|||||||
* You should have received a copy of the GNU Lesser General Public License along with
|
* 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/>.
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package org.oscim.backend.input;
|
package org.oscim.event;
|
||||||
|
|
||||||
public class KeyEvent {
|
public class KeyEvent extends MapEvent{
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public KeyEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
13
vtm/src/org/oscim/event/MapEvent.java
Normal file
13
vtm/src/org/oscim/event/MapEvent.java
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
package org.oscim.event;
|
||||||
|
|
||||||
|
import java.util.EventObject;
|
||||||
|
|
||||||
|
public class MapEvent extends EventObject {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
|
||||||
|
public MapEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
}
|
@ -12,9 +12,18 @@
|
|||||||
* You should have received a copy of the GNU Lesser General Public License along with
|
* 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/>.
|
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||||
*/
|
*/
|
||||||
package org.oscim.backend.input;
|
package org.oscim.event;
|
||||||
|
|
||||||
public abstract class MotionEvent {
|
|
||||||
|
public abstract class MotionEvent extends MapEvent {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
|
||||||
|
public static final String TYPE = "MotionEvent";
|
||||||
|
|
||||||
|
public MotionEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
public static final int ACTION_DOWN = 0;
|
public static final int ACTION_DOWN = 0;
|
||||||
public static final int ACTION_UP = 1;
|
public static final int ACTION_UP = 1;
|
16
vtm/src/org/oscim/event/UpdateEvent.java
Normal file
16
vtm/src/org/oscim/event/UpdateEvent.java
Normal file
@ -0,0 +1,16 @@
|
|||||||
|
package org.oscim.event;
|
||||||
|
|
||||||
|
|
||||||
|
public class UpdateEvent extends MapEvent {
|
||||||
|
|
||||||
|
private static final long serialVersionUID = 1L;
|
||||||
|
public static final String TYPE = "UpdateEvent";
|
||||||
|
|
||||||
|
public UpdateEvent(Object source) {
|
||||||
|
super(source);
|
||||||
|
}
|
||||||
|
|
||||||
|
public boolean positionChanged;
|
||||||
|
public boolean clearMap;
|
||||||
|
|
||||||
|
}
|
@ -44,14 +44,14 @@ public class CustomRenderLayer extends Layer {
|
|||||||
|
|
||||||
private int someConccurentVariable;
|
private int someConccurentVariable;
|
||||||
|
|
||||||
@Override
|
// @Override
|
||||||
public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
// public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
||||||
|
//
|
||||||
synchronized (mRenderer) {
|
// synchronized (mRenderer) {
|
||||||
// chang
|
// // chang
|
||||||
someConccurentVariable++;
|
// someConccurentVariable++;
|
||||||
}
|
// }
|
||||||
|
//
|
||||||
}
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -15,8 +15,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.layers;
|
package org.oscim.layers;
|
||||||
|
|
||||||
import org.oscim.backend.input.KeyEvent;
|
import org.oscim.event.KeyEvent;
|
||||||
import org.oscim.backend.input.MotionEvent;
|
import org.oscim.event.MotionEvent;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
|
|
||||||
public abstract class InputLayer extends Layer {
|
public abstract class InputLayer extends Layer {
|
||||||
|
@ -14,11 +14,12 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.layers;
|
package org.oscim.layers;
|
||||||
|
|
||||||
import org.oscim.core.MapPosition;
|
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.renderer.LayerRenderer;
|
import org.oscim.renderer.LayerRenderer;
|
||||||
|
|
||||||
public abstract class Layer {
|
public abstract class Layer {
|
||||||
|
|
||||||
public Layer(Map map) {
|
public Layer(Map map) {
|
||||||
mMap = map;
|
mMap = map;
|
||||||
}
|
}
|
||||||
@ -32,33 +33,34 @@ public abstract class Layer {
|
|||||||
return mRenderer;
|
return mRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
public void setEnabled(boolean enabled) {
|
public void setEnabled(boolean enabled) {
|
||||||
mEnabled = enabled;
|
mEnabled = enabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
*/
|
|
||||||
public boolean isEnabled() {
|
public boolean isEnabled() {
|
||||||
return mEnabled;
|
return mEnabled;
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
// /**
|
||||||
* Called before each frame render request (on main thread).
|
// * Called before each frame render request (on main thread).
|
||||||
*
|
// *
|
||||||
* @param mapPosition
|
// * @param mapPosition
|
||||||
* current MapPosition
|
// * current MapPosition
|
||||||
* @param changed
|
// * @param changed
|
||||||
* true when MapPosition has changed since last call
|
// * true when MapPosition has changed since last call
|
||||||
* @param clear
|
// * @param clear
|
||||||
* Clear all resources that depend on previous map state. Most
|
// * Clear all resources that depend on previous map state. Most
|
||||||
* importantly all resources from previous GL context (hold by
|
// * importantly all resources from previous GL context (hold by
|
||||||
* RenderLayer)
|
// * RenderLayer)
|
||||||
*/
|
// */
|
||||||
public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
// public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
// @Override
|
||||||
|
// public void handleEvent(MapEvent e){
|
||||||
|
//
|
||||||
|
// }
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Override to perform clean up of resources before shutdown. By default
|
* Override to perform clean up of resources before shutdown. By default
|
||||||
|
@ -15,8 +15,10 @@
|
|||||||
package org.oscim.layers;
|
package org.oscim.layers;
|
||||||
|
|
||||||
import org.oscim.backend.Log;
|
import org.oscim.backend.Log;
|
||||||
import org.oscim.backend.input.MotionEvent;
|
|
||||||
import org.oscim.core.Tile;
|
import org.oscim.core.Tile;
|
||||||
|
import org.oscim.event.EventListener;
|
||||||
|
import org.oscim.event.MapEvent;
|
||||||
|
import org.oscim.event.MotionEvent;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.map.Viewport;
|
import org.oscim.map.Viewport;
|
||||||
|
|
||||||
@ -30,7 +32,7 @@ import org.oscim.map.Viewport;
|
|||||||
* http://en.wikipedia.org/wiki/Viterbi_algorithm
|
* http://en.wikipedia.org/wiki/Viterbi_algorithm
|
||||||
*/
|
*/
|
||||||
|
|
||||||
public class MapEventLayer extends InputLayer {
|
public class MapEventLayer extends Layer implements EventListener {
|
||||||
private static final boolean debug = false;
|
private static final boolean debug = false;
|
||||||
private static final String TAG = MapEventLayer.class.getName();
|
private static final String TAG = MapEventLayer.class.getName();
|
||||||
|
|
||||||
@ -65,10 +67,21 @@ public class MapEventLayer extends InputLayer {
|
|||||||
|
|
||||||
public MapEventLayer(Map map) {
|
public MapEventLayer(Map map) {
|
||||||
super(map);
|
super(map);
|
||||||
|
map.addListener(MotionEvent.TYPE, this);
|
||||||
mMapPosition = map.getViewport();
|
mMapPosition = map.getViewport();
|
||||||
mTracker = new VelocityTracker();
|
mTracker = new VelocityTracker();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void onDetach() {
|
||||||
|
mMap.removeListener(MotionEvent.TYPE, this);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleEvent(MapEvent event){
|
||||||
|
if (event instanceof MotionEvent)
|
||||||
|
onTouchEvent((MotionEvent)event);
|
||||||
|
}
|
||||||
//private long mPrevTime;
|
//private long mPrevTime;
|
||||||
|
|
||||||
private boolean mEnableRotation = true;
|
private boolean mEnableRotation = true;
|
||||||
@ -96,7 +109,7 @@ public class MapEventLayer extends InputLayer {
|
|||||||
mEnableZoom = enable;
|
mEnableZoom = enable;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
//@Override
|
||||||
public boolean onTouchEvent(MotionEvent e) {
|
public boolean onTouchEvent(MotionEvent e) {
|
||||||
|
|
||||||
//mPrevTime = e.getTime();
|
//mPrevTime = e.getTime();
|
||||||
@ -441,5 +454,4 @@ public class MapEventLayer extends InputLayer {
|
|||||||
// return sum;
|
// return sum;
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -17,9 +17,9 @@ package org.oscim.layers.marker;
|
|||||||
|
|
||||||
import java.util.List;
|
import java.util.List;
|
||||||
|
|
||||||
import org.oscim.backend.input.MotionEvent;
|
|
||||||
import org.oscim.core.BoundingBox;
|
import org.oscim.core.BoundingBox;
|
||||||
import org.oscim.core.Point;
|
import org.oscim.core.Point;
|
||||||
|
import org.oscim.event.MotionEvent;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.map.Viewport;
|
import org.oscim.map.Viewport;
|
||||||
|
|
||||||
|
@ -16,14 +16,16 @@ package org.oscim.layers.tile;
|
|||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.event.EventListener;
|
||||||
|
import org.oscim.event.MapEvent;
|
||||||
|
import org.oscim.event.UpdateEvent;
|
||||||
import org.oscim.layers.Layer;
|
import org.oscim.layers.Layer;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.tiling.TileLoader;
|
import org.oscim.tiling.TileLoader;
|
||||||
import org.oscim.tiling.TileManager;
|
import org.oscim.tiling.TileManager;
|
||||||
import org.oscim.tiling.TileRenderer;
|
import org.oscim.tiling.TileRenderer;
|
||||||
|
|
||||||
public abstract class TileLayer<T extends TileLoader> extends Layer {
|
public abstract class TileLayer<T extends TileLoader> extends Layer implements EventListener {
|
||||||
//private final static String TAG = TileLayer.class.getName();
|
//private final static String TAG = TileLayer.class.getName();
|
||||||
private final static int MAX_ZOOMLEVEL = 17;
|
private final static int MAX_ZOOMLEVEL = 17;
|
||||||
private final static int MIN_ZOOMLEVEL = 2;
|
private final static int MIN_ZOOMLEVEL = 2;
|
||||||
@ -59,6 +61,8 @@ public abstract class TileLayer<T extends TileLoader> extends Layer {
|
|||||||
// RenderLayer is working in GL Thread and actually
|
// RenderLayer is working in GL Thread and actually
|
||||||
// drawing loaded tiles to screen.
|
// drawing loaded tiles to screen.
|
||||||
mRenderer = mRenderLayer = new TileRenderer(mTileManager);
|
mRenderer = mRenderLayer = new TileRenderer(mTileManager);
|
||||||
|
|
||||||
|
map.addListener(UpdateEvent.TYPE, this);
|
||||||
}
|
}
|
||||||
|
|
||||||
abstract protected T createLoader(TileManager tm);
|
abstract protected T createLoader(TileManager tm);
|
||||||
@ -67,22 +71,44 @@ public abstract class TileLayer<T extends TileLoader> extends Layer {
|
|||||||
return (TileRenderer) mRenderer;
|
return (TileRenderer) mRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
||||||
|
//
|
||||||
|
// if (clear || mInitial) {
|
||||||
|
// mRenderLayer.clearTiles();
|
||||||
|
// mTileManager.init(mInitial);
|
||||||
|
// mInitial = false;
|
||||||
|
// changed = true;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// if (changed && mTileManager.update(mapPosition))
|
||||||
|
// notifyLoaders();
|
||||||
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
public void handleEvent(MapEvent event) {
|
||||||
|
if (event instanceof UpdateEvent) {
|
||||||
|
|
||||||
if (clear || mInitial) {
|
UpdateEvent e = (UpdateEvent) event;
|
||||||
mRenderLayer.clearTiles();
|
|
||||||
mTileManager.init(mInitial);
|
boolean changed = e.positionChanged;
|
||||||
mInitial = false;
|
|
||||||
changed = true;
|
if (e.clearMap || mInitial) {
|
||||||
|
mRenderLayer.clearTiles();
|
||||||
|
mTileManager.init(mInitial);
|
||||||
|
mInitial = false;
|
||||||
|
changed = true;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (changed && mTileManager.update(mMap.getMapPosition()))
|
||||||
|
notifyLoaders();
|
||||||
}
|
}
|
||||||
|
|
||||||
if (changed && mTileManager.update(mapPosition))
|
|
||||||
notifyLoaders();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDetach() {
|
public void onDetach() {
|
||||||
|
mMap.removeListener(UpdateEvent.TYPE, this);
|
||||||
|
|
||||||
for (T loader : mTileLoader) {
|
for (T loader : mTileLoader) {
|
||||||
loader.pause();
|
loader.pause();
|
||||||
loader.interrupt();
|
loader.interrupt();
|
||||||
|
@ -24,6 +24,8 @@ import org.oscim.backend.CanvasAdapter;
|
|||||||
import org.oscim.backend.canvas.Bitmap;
|
import org.oscim.backend.canvas.Bitmap;
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.core.MapPosition;
|
||||||
import org.oscim.core.Tile;
|
import org.oscim.core.Tile;
|
||||||
|
import org.oscim.event.MapEvent;
|
||||||
|
import org.oscim.event.UpdateEvent;
|
||||||
import org.oscim.layers.tile.TileLayer;
|
import org.oscim.layers.tile.TileLayer;
|
||||||
import org.oscim.layers.tile.bitmap.TileSource.FadeStep;
|
import org.oscim.layers.tile.bitmap.TileSource.FadeStep;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
@ -35,7 +37,7 @@ import org.oscim.tiling.TileManager;
|
|||||||
import org.oscim.utils.FastMath;
|
import org.oscim.utils.FastMath;
|
||||||
|
|
||||||
|
|
||||||
public class BitmapTileLayer extends TileLayer<TileLoader> {
|
public class BitmapTileLayer extends TileLayer<TileLoader> {
|
||||||
private static final int TIMEOUT_CONNECT = 5000;
|
private static final int TIMEOUT_CONNECT = 5000;
|
||||||
private static final int TIMEOUT_READ = 10000;
|
private static final int TIMEOUT_READ = 10000;
|
||||||
protected static final String TAG = BitmapTileLayer.class.getName();
|
protected static final String TAG = BitmapTileLayer.class.getName();
|
||||||
@ -50,33 +52,67 @@ public class BitmapTileLayer extends TileLayer<TileLoader> {
|
|||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public void onUpdate(MapPosition pos, boolean changed, boolean clear) {
|
||||||
|
// super.onUpdate(pos, changed, clear);
|
||||||
|
//
|
||||||
|
// if (mFade == null) {
|
||||||
|
// mRenderLayer.setBitmapAlpha(1);
|
||||||
|
// return;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// float alpha = 0;
|
||||||
|
// for (FadeStep f : mFade) {
|
||||||
|
// if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd)
|
||||||
|
// continue;
|
||||||
|
//
|
||||||
|
// if (f.alphaStart == f.alphaEnd) {
|
||||||
|
// alpha = f.alphaStart;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
// double range = f.scaleEnd / f.scaleStart;
|
||||||
|
// float a = (float)((range - (pos.scale / f.scaleStart)) / range);
|
||||||
|
// a = FastMath.clamp(a, 0, 1);
|
||||||
|
// // interpolate alpha between start and end
|
||||||
|
// alpha = a * f.alphaStart + (1 - a) * f.alphaEnd;
|
||||||
|
// break;
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// mRenderLayer.setBitmapAlpha(alpha);
|
||||||
|
// }
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onUpdate(MapPosition pos, boolean changed, boolean clear) {
|
public void handleEvent(MapEvent event) {
|
||||||
super.onUpdate(pos, changed, clear);
|
super.handleEvent(event);
|
||||||
|
|
||||||
if (mFade == null) {
|
if (event instanceof UpdateEvent){
|
||||||
mRenderLayer.setBitmapAlpha(1);
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
float alpha = 0;
|
if (mFade == null) {
|
||||||
for (FadeStep f : mFade) {
|
mRenderLayer.setBitmapAlpha(1);
|
||||||
if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd)
|
return;
|
||||||
continue;
|
}
|
||||||
|
MapPosition pos = mMap.getMapPosition();
|
||||||
|
|
||||||
if (f.alphaStart == f.alphaEnd) {
|
float alpha = 0;
|
||||||
alpha = f.alphaStart;
|
for (FadeStep f : mFade) {
|
||||||
|
if (pos.scale < f.scaleStart || pos.scale > f.scaleEnd)
|
||||||
|
continue;
|
||||||
|
|
||||||
|
if (f.alphaStart == f.alphaEnd) {
|
||||||
|
alpha = f.alphaStart;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
double range = f.scaleEnd / f.scaleStart;
|
||||||
|
float a = (float)((range - (pos.scale / f.scaleStart)) / range);
|
||||||
|
a = FastMath.clamp(a, 0, 1);
|
||||||
|
// interpolate alpha between start and end
|
||||||
|
alpha = a * f.alphaStart + (1 - a) * f.alphaEnd;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
double range = f.scaleEnd / f.scaleStart;
|
|
||||||
float a = (float)((range - (pos.scale / f.scaleStart)) / range);
|
|
||||||
a = FastMath.clamp(a, 0, 1);
|
|
||||||
// interpolate alpha between start and end
|
|
||||||
alpha = a * f.alphaStart + (1 - a) * f.alphaEnd;
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
mRenderLayer.setBitmapAlpha(alpha);
|
mRenderLayer.setBitmapAlpha(alpha);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
@ -14,8 +14,8 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.layers.tile.vector;
|
package org.oscim.layers.tile.vector;
|
||||||
|
|
||||||
import org.oscim.backend.input.MotionEvent;
|
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.core.MapPosition;
|
||||||
|
import org.oscim.event.MotionEvent;
|
||||||
import org.oscim.layers.InputLayer;
|
import org.oscim.layers.InputLayer;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.renderer.ExtrusionRenderer;
|
import org.oscim.renderer.ExtrusionRenderer;
|
||||||
|
@ -14,54 +14,90 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.layers.tile.vector.labeling;
|
package org.oscim.layers.tile.vector.labeling;
|
||||||
|
|
||||||
import org.oscim.backend.input.MotionEvent;
|
import org.oscim.backend.Log;
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.event.EventListener;
|
||||||
import org.oscim.layers.InputLayer;
|
import org.oscim.event.MapEvent;
|
||||||
|
import org.oscim.event.MotionEvent;
|
||||||
|
import org.oscim.event.UpdateEvent;
|
||||||
|
import org.oscim.layers.Layer;
|
||||||
import org.oscim.map.Map;
|
import org.oscim.map.Map;
|
||||||
import org.oscim.tiling.TileRenderer;
|
import org.oscim.tiling.TileRenderer;
|
||||||
|
|
||||||
import org.oscim.backend.Log;
|
public class LabelLayer extends Layer implements EventListener {
|
||||||
|
|
||||||
public class LabelLayer extends InputLayer {
|
|
||||||
private final static String TAG = LabelLayer.class.getName();
|
private final static String TAG = LabelLayer.class.getName();
|
||||||
final TextRenderer mTextRenderer;
|
private final TextRenderer mTextRenderer;
|
||||||
|
|
||||||
|
private int multi;
|
||||||
|
|
||||||
public LabelLayer(Map map, TileRenderer tileRenderLayer) {
|
public LabelLayer(Map map, TileRenderer tileRenderLayer) {
|
||||||
super(map);
|
super(map);
|
||||||
|
map.addListener(UpdateEvent.TYPE, this);
|
||||||
|
map.addListener(MotionEvent.TYPE, this);
|
||||||
|
|
||||||
//mTextLayer = new org.oscim.renderer.layers.TextRenderLayer(map, tileRenderLayer);
|
//mTextLayer = new org.oscim.renderer.layers.TextRenderLayer(map, tileRenderLayer);
|
||||||
mTextRenderer = new TextRenderer(map, tileRenderLayer);
|
mTextRenderer = new TextRenderer(map, tileRenderLayer);
|
||||||
mRenderer = mTextRenderer;
|
mRenderer = mTextRenderer;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
|
||||||
public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
|
||||||
if (clear)
|
|
||||||
mTextRenderer.clearLabels();
|
|
||||||
}
|
|
||||||
|
|
||||||
private int multi;
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public boolean onTouchEvent(MotionEvent e) {
|
|
||||||
int action = e.getAction() & MotionEvent.ACTION_MASK;
|
|
||||||
if (action == MotionEvent.ACTION_POINTER_DOWN) {
|
|
||||||
multi++;
|
|
||||||
mTextRenderer.hold(true);
|
|
||||||
} else if (action == MotionEvent.ACTION_POINTER_UP) {
|
|
||||||
multi--;
|
|
||||||
if (multi == 0)
|
|
||||||
mTextRenderer.hold(false);
|
|
||||||
} else if (action == MotionEvent.ACTION_CANCEL) {
|
|
||||||
multi = 0;
|
|
||||||
Log.d(TAG, "cancel " + multi);
|
|
||||||
mTextRenderer.hold(false);
|
|
||||||
}
|
|
||||||
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onDetach() {
|
public void onDetach() {
|
||||||
|
mMap.removeListener(UpdateEvent.TYPE, this);
|
||||||
|
mMap.removeListener(MotionEvent.TYPE, this);
|
||||||
|
|
||||||
|
// TODO stop and clear labeling thread
|
||||||
|
super.onDetach();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void handleEvent(MapEvent event) {
|
||||||
|
if (event instanceof UpdateEvent) {
|
||||||
|
|
||||||
|
UpdateEvent e = (UpdateEvent) event;
|
||||||
|
if (e.clearMap)
|
||||||
|
mTextRenderer.clearLabels();
|
||||||
|
|
||||||
|
} else if (event instanceof MotionEvent) {
|
||||||
|
MotionEvent e = (MotionEvent) event;
|
||||||
|
|
||||||
|
int action = e.getAction() & MotionEvent.ACTION_MASK;
|
||||||
|
if (action == MotionEvent.ACTION_POINTER_DOWN) {
|
||||||
|
multi++;
|
||||||
|
mTextRenderer.hold(true);
|
||||||
|
} else if (action == MotionEvent.ACTION_POINTER_UP) {
|
||||||
|
multi--;
|
||||||
|
if (multi == 0)
|
||||||
|
mTextRenderer.hold(false);
|
||||||
|
} else if (action == MotionEvent.ACTION_CANCEL) {
|
||||||
|
multi = 0;
|
||||||
|
Log.d(TAG, "cancel " + multi);
|
||||||
|
mTextRenderer.hold(false);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
||||||
|
// if (clear)
|
||||||
|
// mTextRenderer.clearLabels();
|
||||||
|
// }
|
||||||
|
|
||||||
|
// @Override
|
||||||
|
// public boolean onTouchEvent(MotionEvent e) {
|
||||||
|
// int action = e.getAction() & MotionEvent.ACTION_MASK;
|
||||||
|
// if (action == MotionEvent.ACTION_POINTER_DOWN) {
|
||||||
|
// multi++;
|
||||||
|
// mTextRenderer.hold(true);
|
||||||
|
// } else if (action == MotionEvent.ACTION_POINTER_UP) {
|
||||||
|
// multi--;
|
||||||
|
// if (multi == 0)
|
||||||
|
// mTextRenderer.hold(false);
|
||||||
|
// } else if (action == MotionEvent.ACTION_CANCEL) {
|
||||||
|
// multi = 0;
|
||||||
|
// Log.d(TAG, "cancel " + multi);
|
||||||
|
// mTextRenderer.hold(false);
|
||||||
|
// }
|
||||||
|
//
|
||||||
|
// return false;
|
||||||
|
// }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -20,9 +20,9 @@ import java.util.AbstractList;
|
|||||||
import java.util.concurrent.CopyOnWriteArrayList;
|
import java.util.concurrent.CopyOnWriteArrayList;
|
||||||
|
|
||||||
import org.oscim.backend.Log;
|
import org.oscim.backend.Log;
|
||||||
import org.oscim.backend.input.KeyEvent;
|
|
||||||
import org.oscim.backend.input.MotionEvent;
|
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.core.MapPosition;
|
||||||
|
import org.oscim.event.KeyEvent;
|
||||||
|
import org.oscim.event.MotionEvent;
|
||||||
import org.oscim.layers.InputLayer;
|
import org.oscim.layers.InputLayer;
|
||||||
import org.oscim.layers.Layer;
|
import org.oscim.layers.Layer;
|
||||||
import org.oscim.renderer.LayerRenderer;
|
import org.oscim.renderer.LayerRenderer;
|
||||||
@ -74,14 +74,14 @@ public class Layers extends AbstractList<Layer> {
|
|||||||
|
|
||||||
return mLayerRenderer;
|
return mLayerRenderer;
|
||||||
}
|
}
|
||||||
|
//
|
||||||
public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
// public void onUpdate(MapPosition mapPosition, boolean changed, boolean clear) {
|
||||||
if (mDirtyLayers)
|
// if (mDirtyLayers)
|
||||||
updateLayers();
|
// updateLayers();
|
||||||
|
//
|
||||||
for (Layer l : mLayers)
|
// for (Layer l : mLayers)
|
||||||
l.onUpdate(mapPosition, changed, clear);
|
// l.onUpdate(mapPosition, changed, clear);
|
||||||
}
|
// }
|
||||||
|
|
||||||
public void destroy() {
|
public void destroy() {
|
||||||
if (mDirtyLayers)
|
if (mDirtyLayers)
|
||||||
|
@ -14,10 +14,16 @@
|
|||||||
*/
|
*/
|
||||||
package org.oscim.map;
|
package org.oscim.map;
|
||||||
|
|
||||||
|
import java.util.ArrayList;
|
||||||
|
|
||||||
import org.oscim.backend.Log;
|
import org.oscim.backend.Log;
|
||||||
import org.oscim.core.BoundingBox;
|
import org.oscim.core.BoundingBox;
|
||||||
import org.oscim.core.GeoPoint;
|
import org.oscim.core.GeoPoint;
|
||||||
import org.oscim.core.MapPosition;
|
import org.oscim.core.MapPosition;
|
||||||
|
import org.oscim.event.EventDispatcher;
|
||||||
|
import org.oscim.event.EventListener;
|
||||||
|
import org.oscim.event.MotionEvent;
|
||||||
|
import org.oscim.event.UpdateEvent;
|
||||||
import org.oscim.layers.MapEventLayer;
|
import org.oscim.layers.MapEventLayer;
|
||||||
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
|
import org.oscim.layers.tile.bitmap.BitmapTileLayer;
|
||||||
import org.oscim.layers.tile.vector.VectorTileLayer;
|
import org.oscim.layers.tile.vector.VectorTileLayer;
|
||||||
@ -29,7 +35,7 @@ import org.oscim.theme.ThemeLoader;
|
|||||||
import org.oscim.tiling.source.TileSource;
|
import org.oscim.tiling.source.TileSource;
|
||||||
import org.oscim.utils.async.AsyncExecutor;
|
import org.oscim.utils.async.AsyncExecutor;
|
||||||
|
|
||||||
public abstract class Map {
|
public abstract class Map implements EventDispatcher {
|
||||||
|
|
||||||
private static final String TAG = Map.class.getName();
|
private static final String TAG = Map.class.getName();
|
||||||
|
|
||||||
@ -172,7 +178,15 @@ public abstract class Map {
|
|||||||
// get the current MapPosition
|
// get the current MapPosition
|
||||||
changed |= mViewport.getMapPosition(mMapPosition);
|
changed |= mViewport.getMapPosition(mMapPosition);
|
||||||
|
|
||||||
mLayers.onUpdate(mMapPosition, changed, mClearMap);
|
//mLayers.onUpdate(mMapPosition, changed, mClearMap);
|
||||||
|
|
||||||
|
UpdateEvent e = new UpdateEvent(this);
|
||||||
|
e.clearMap = mClearMap;
|
||||||
|
e.positionChanged = changed;
|
||||||
|
|
||||||
|
for (EventListener l : mUpdateListeners)
|
||||||
|
l.handleEvent(e);
|
||||||
|
|
||||||
mClearMap = false;
|
mClearMap = false;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -223,4 +237,33 @@ public abstract class Map {
|
|||||||
public MapAnimator getAnimator() {
|
public MapAnimator getAnimator() {
|
||||||
return mAnimator;
|
return mAnimator;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
ArrayList<EventListener> mUpdateListeners = new ArrayList<EventListener>();
|
||||||
|
ArrayList<EventListener> mMotionListeners = new ArrayList<EventListener>();
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public void addListener(String type, EventListener listener) {
|
||||||
|
if (type == UpdateEvent.TYPE)
|
||||||
|
mUpdateListeners.add(listener);
|
||||||
|
else if (type == MotionEvent.TYPE)
|
||||||
|
mMotionListeners.add(listener);
|
||||||
|
|
||||||
|
}
|
||||||
|
@Override
|
||||||
|
public void removeListener(String type, EventListener listener) {
|
||||||
|
if (type == UpdateEvent.TYPE)
|
||||||
|
mUpdateListeners.remove(listener);
|
||||||
|
else if (type == MotionEvent.TYPE)
|
||||||
|
mMotionListeners.remove(listener);
|
||||||
|
}
|
||||||
|
|
||||||
|
public MapPosition getMapPosition() {
|
||||||
|
return mMapPosition;
|
||||||
|
}
|
||||||
|
|
||||||
|
public void handleMotionEvent(MotionEvent e) {
|
||||||
|
for (EventListener l : mMotionListeners)
|
||||||
|
l.handleEvent(e);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user