fix projection, filter visible items by bbox

This commit is contained in:
Hannes Janetzek 2013-03-13 02:58:59 +01:00
parent efaafce08c
commit c9f980b99b

View File

@ -18,23 +18,23 @@ package org.oscim.overlay;
import java.util.List; import java.util.List;
import org.oscim.app.R; import org.oscim.app.R;
import org.oscim.core.BoundingBox;
import org.oscim.core.PointF;
import org.oscim.view.MapView; import org.oscim.view.MapView;
import org.oscim.view.MapViewPosition; import org.oscim.view.MapViewPosition;
import android.content.Context; import android.content.Context;
import android.graphics.Point;
import android.graphics.drawable.Drawable; import android.graphics.drawable.Drawable;
import android.util.Log;
import android.view.MotionEvent; import android.view.MotionEvent;
public class ItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverlay<Item> { public class ItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverlay<Item> {
private static final String TAG = ItemizedIconOverlay.class.getSimpleName(); private static final String TAG = ItemizedIconOverlay.class.getName();
protected final List<Item> mItemList; protected final List<Item> mItemList;
protected OnItemGestureListener<Item> mOnItemGestureListener; protected OnItemGestureListener<Item> mOnItemGestureListener;
private int mDrawnItemsLimit = Integer.MAX_VALUE; private int mDrawnItemsLimit = Integer.MAX_VALUE;
private final Point mItemPoint = new Point(); private final PointF mItemPoint = new PointF();
public ItemizedIconOverlay( public ItemizedIconOverlay(
final MapView mapView, final MapView mapView,
@ -59,7 +59,7 @@ public class ItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverl
} }
@Override @Override
public boolean onSnapToItem(final int pX, final int pY, final Point pSnapPoint) { public boolean onSnapToItem(final int pX, final int pY, final PointF pSnapPoint) {
// TODO Implement this! // TODO Implement this!
return false; return false;
} }
@ -122,52 +122,43 @@ public class ItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverl
*/ */
@Override @Override
public boolean onSingleTapUp(final MotionEvent event) { public boolean onSingleTapUp(final MotionEvent event) {
return (activateSelectedItems(event, new ActiveItem() { return activateSelectedItems(event, mActiveItemSingleTap) || super.onSingleTapUp(event);
@Override
public boolean run(final int index) {
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
if (that.mOnItemGestureListener == null) {
return false;
}
return onSingleTapUpHelper(index, that.mItemList.get(index), mMapView);
}
})) || super.onSingleTapUp(event);
} }
/** protected boolean onSingleTapUpHelper(final int index, final Item item) {
* @param index
* ...
* @param item
* ...
* @param mapView
* ...
* @return ...
*/
protected boolean onSingleTapUpHelper(final int index, final Item item, final MapView mapView) {
return this.mOnItemGestureListener.onItemSingleTapUp(index, item); return this.mOnItemGestureListener.onItemSingleTapUp(index, item);
} }
private final ActiveItem mActiveItemSingleTap = new ActiveItem() {
@Override
public boolean run(final int index) {
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
if (that.mOnItemGestureListener == null) {
return false;
}
return onSingleTapUpHelper(index, that.mItemList.get(index));
}
};
@Override @Override
public boolean onLongPress(final MotionEvent event) { public boolean onLongPress(final MotionEvent event) {
return activateSelectedItems(event, mActiveItemLongPress) || super.onLongPress(event);
Log.d(TAG, "onLongPress");
return (activateSelectedItems(event, new ActiveItem() {
@Override
public boolean run(final int index) {
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
if (that.mOnItemGestureListener == null) {
return false;
}
return onLongPressHelper(index, getItem(index));
}
})) || super.onLongPress(event);
} }
protected boolean onLongPressHelper(final int index, final Item item) { protected boolean onLongPressHelper(final int index, final Item item) {
return this.mOnItemGestureListener.onItemLongPress(index, item); return this.mOnItemGestureListener.onItemLongPress(index, item);
} }
private final ActiveItem mActiveItemLongPress = new ActiveItem() {
@Override
public boolean run(final int index) {
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
if (that.mOnItemGestureListener == null) {
return false;
}
return onLongPressHelper(index, getItem(index));
}
};
/** /**
* When a content sensitive action is performed the content item needs to be * When a content sensitive action is performed the content item needs to be
* identified. This method does that and then performs the assigned task on * identified. This method does that and then performs the assigned task on
@ -180,25 +171,37 @@ public class ItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverl
* @return true if event is handled false otherwise * @return true if event is handled false otherwise
*/ */
private boolean activateSelectedItems(MotionEvent event, ActiveItem task) { private boolean activateSelectedItems(MotionEvent event, ActiveItem task) {
int eventX = (int) event.getX() - mMapView.getWidth()/2; int size = mItemList.size();
int eventY = (int) event.getY() - mMapView.getHeight()/2; if (size == 0)
return false;
int eventX = (int) event.getX() - mMapView.getWidth() / 2;
int eventY = (int) event.getY() - mMapView.getHeight() / 2;
MapViewPosition mapViewPosition = mMapView.getMapViewPosition(); MapViewPosition mapViewPosition = mMapView.getMapViewPosition();
BoundingBox bbox = mapViewPosition.getViewBox();
int nearest = -1; int nearest = -1;
double dist = Double.MAX_VALUE; double dist = Double.MAX_VALUE;
// TODO use intermediate projection and bounding box test for (int i = 0; i < size; i++) {
for (int i = 0; i < this.mItemList.size(); i++) {
Item item = getItem(i); Item item = getItem(i);
if (!bbox.contains(item.mGeoPoint)){
//Log.d(TAG, "skip: " + item.getTitle());
continue;
}
// final Drawable marker = (item.getMarker(0) == null) ? this.mDefaultMarker : item // final Drawable marker = (item.getMarker(0) == null) ? this.mDefaultMarker : item
// .getMarker(0); // .getMarker(0);
// TODO use intermediate projection
mapViewPosition.project(item.getPoint(), mItemPoint); mapViewPosition.project(item.getPoint(), mItemPoint);
int dx = mItemPoint.x - eventX; float dx = mItemPoint.x - eventX;
int dy = mItemPoint.y - eventY; float dy = mItemPoint.y - eventY;
double d = dx * dx + dy * dy;
//Log.d(TAG, item.getTitle() + " " + mItemPoint + " " + dx + "/" + dy);
double d = dx * dx + dy * dy;
// squared dist: 50*50 pixel // squared dist: 50*50 pixel
if (d < 2500) { if (d < 2500) {