fix wrap over date-line, again

started on-hold mode to avoid relabeling while zoom gesture is active
This commit is contained in:
Hannes Janetzek 2013-01-10 06:48:31 +01:00
parent c99ae9237e
commit f266d61a35
2 changed files with 72 additions and 15 deletions

View File

@ -17,13 +17,40 @@ package org.oscim.overlay;
import org.oscim.renderer.overlays.TextOverlay; import org.oscim.renderer.overlays.TextOverlay;
import org.oscim.view.MapView; import org.oscim.view.MapView;
import android.util.Log;
import android.view.MotionEvent;
/** /**
* @author Hannes Janetzek * @author Hannes Janetzek
*/ */
public class LabelingOverlay extends Overlay { public class LabelingOverlay extends Overlay {
private final static String TAG = LabelingOverlay.class.getName();
final TextOverlay mTextLayer;
public LabelingOverlay(MapView mapView) { public LabelingOverlay(MapView mapView) {
super(); super();
mLayer = new TextOverlay(mapView); mTextLayer = new TextOverlay(mapView);
mLayer = mTextLayer;
}
private int multi;
@Override
public boolean onTouchEvent(MotionEvent e, MapView mapView) {
int action = e.getAction() & MotionEvent.ACTION_MASK;
if (action == MotionEvent.ACTION_POINTER_DOWN) {
multi++;
mTextLayer.hold(true);
} else if (action == MotionEvent.ACTION_POINTER_UP) {
multi--;
if (multi == 0)
mTextLayer.hold(false);
} else if (action == MotionEvent.ACTION_CANCEL) {
multi = 0;
Log.d(TAG, "cancel " + multi);
mTextLayer.hold(false);
}
return false;
} }
} }

View File

@ -33,7 +33,7 @@ import android.os.SystemClock;
public class TextOverlay extends RenderOverlay { public class TextOverlay extends RenderOverlay {
private TileSet tiles; private TileSet mTiles;
private LabelThread mThread; private LabelThread mThread;
private MapPosition mWorkPos; private MapPosition mWorkPos;
@ -47,7 +47,10 @@ public class TextOverlay extends RenderOverlay {
@Override @Override
protected void doWork() { protected void doWork() {
SystemClock.sleep(500); SystemClock.sleep(250);
if (!mRun)
return;
mRun = false; mRun = false;
updateLabels(); updateLabels();
mMapView.redrawMap(); mMapView.redrawMap();
@ -73,10 +76,10 @@ public class TextOverlay extends RenderOverlay {
} }
void updateLabels() { void updateLabels() {
tiles = TileManager.getActiveTiles(tiles); mTiles = TileManager.getActiveTiles(mTiles);
// Log.d("...", "relabel " + mRerun + " " + x + " " + y); // Log.d("...", "relabel " + mRerun + " " + x + " " + y);
if (tiles.cnt == 0) if (mTiles.cnt == 0)
return; return;
mMapView.getMapViewPosition().getMapPosition(mWorkPos, null); mMapView.getMapViewPosition().getMapPosition(mWorkPos, null);
@ -86,11 +89,12 @@ public class TextOverlay extends RenderOverlay {
if (tl == null) if (tl == null)
tl = new TextLayer(); tl = new TextLayer();
// tiles might be from another zoomlevel than the current: // mTiles might be from another zoomlevel than the current:
// this scales MapPosition to the zoomlevel of tiles... // this scales MapPosition to the zoomlevel of mTiles...
// TODO create a helper function in MapPosition // TODO create a helper function in MapPosition
int diff = tiles.tiles[0].zoomLevel - mWorkPos.zoomLevel; int diff = mTiles.tiles[0].zoomLevel - mWorkPos.zoomLevel;
// only relabel when tiles belong to the current zoomlevel or its parent
if (diff > 1 || diff < -2) { if (diff > 1 || diff < -2) {
synchronized (this) { synchronized (this) {
mNewLayer = tl; mNewLayer = tl;
@ -107,14 +111,20 @@ public class TextOverlay extends RenderOverlay {
int maxx = Tile.TILE_SIZE << (mWorkPos.zoomLevel - 1); int maxx = Tile.TILE_SIZE << (mWorkPos.zoomLevel - 1);
MapTile[] tiles = mTiles.tiles;
// order tiles by x/y coordinate to make placement more consistent
// while map position changes
//Arrays.sort(tiles, 0, mTiles.cnt, TileSet.coordComparator);
// TODO more sophisticated placement :) // TODO more sophisticated placement :)
for (int i = 0, n = tiles.cnt; i < n; i++) { for (int i = 0, n = mTiles.cnt; i < n; i++) {
MapTile t = tiles.tiles[i]; MapTile t = tiles[i];
if (!t.isVisible) if (!t.isVisible)
continue; continue;
float dx = (float) ((t.pixelX - mWorkPos.x) * scale); float dx = (float) (t.pixelX - mWorkPos.x);
float dy = (float) ((t.pixelY - mWorkPos.y) * scale); float dy = (float) (t.pixelY - mWorkPos.y);
// flip around date-line // flip around date-line
if (dx > maxx) { if (dx > maxx) {
@ -122,6 +132,8 @@ public class TextOverlay extends RenderOverlay {
} else if (dx < -maxx) { } else if (dx < -maxx) {
dx = dx + maxx * 2; dx = dx + maxx * 2;
} }
dx *= scale;
dy *= scale;
for (TextItem ti = t.labels; ti != null; ti = ti.next) { for (TextItem ti = t.labels; ti != null; ti = ti.next) {
@ -138,7 +150,7 @@ public class TextOverlay extends RenderOverlay {
int tw = (int) (ti2.width / 2); int tw = (int) (ti2.width / 2);
int th = (int) (ti2.text.fontHeight / 2); int th = (int) (ti2.text.fontHeight / 2);
for (TextItem lp = tl.labels; lp != null; lp = lp.next) { for (TextItem lp = tl.labels; lp != null;) {
int px = (int) (lp.x); int px = (int) (lp.x);
int py = (int) (lp.y); int py = (int) (lp.y);
int ph = (int) (lp.text.fontHeight / 2); int ph = (int) (lp.text.fontHeight / 2);
@ -148,9 +160,11 @@ public class TextOverlay extends RenderOverlay {
&& (px - pw) < (tx + tw) && (px - pw) < (tx + tw)
&& (ty - th) < (py + ph) && (ty - th) < (py + ph)
&& (py - ph) < (ty + th)) { && (py - ph) < (ty + th)) {
overlaps = true; overlaps = true;
break; break;
} }
lp = lp.next;
} }
} else { } else {
@ -178,7 +192,7 @@ public class TextOverlay extends RenderOverlay {
if (GeometryUtils.lineIntersect(ti2.x1, ti2.y1, ti2.x2, ti2.y2, if (GeometryUtils.lineIntersect(ti2.x1, ti2.y1, ti2.x2, ti2.y2,
lp.x1, lp.y1, lp.x2, lp.y2)) { lp.x1, lp.y1, lp.x2, lp.y2)) {
// just to make it more deterministic // just to make it more deterministic
if (lp.width < ti2.width) { if (lp.width > ti2.width) {
TextItem tmp = lp; TextItem tmp = lp;
lp = lp.next; lp = lp.next;
@ -197,7 +211,7 @@ public class TextOverlay extends RenderOverlay {
&& (lp.y1) < (ti2.y2)) { && (lp.y1) < (ti2.y2)) {
// just to make it more deterministic // just to make it more deterministic
if (lp.width < ti2.width) { if (lp.width > ti2.width) {
TextItem tmp = lp; TextItem tmp = lp;
lp = lp.next; lp = lp.next;
@ -244,6 +258,8 @@ public class TextOverlay extends RenderOverlay {
public synchronized void update(MapPosition curPos, boolean positionChanged, public synchronized void update(MapPosition curPos, boolean positionChanged,
boolean tilesChanged) { boolean tilesChanged) {
// Log.d("...", "update " + tilesChanged + " " + positionChanged); // Log.d("...", "update " + tilesChanged + " " + positionChanged);
if (mHolding)
return;
if (mNewLayer != null) { if (mNewLayer != null) {
@ -302,4 +318,18 @@ public class TextOverlay extends RenderOverlay {
Matrix.multiplyMM(matrix, 0, curPos.viewMatrix, 0, matrix, 0); Matrix.multiplyMM(matrix, 0, curPos.viewMatrix, 0, matrix, 0);
} }
private boolean mHolding;
public synchronized void hold(boolean enable) {
// mHolding = enable;
// if (!enable && !mRun) {
// mRun = true;
// synchronized (mThread) {
// mThread.notify();
// }
// } else {
// mRun = false;
// }
}
} }