fix projection, filter visible items by bbox
This commit is contained in:
parent
efaafce08c
commit
c9f980b99b
@ -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,37 +122,33 @@ 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);
|
||||||
|
}
|
||||||
|
|
||||||
|
protected boolean onSingleTapUpHelper(final int index, final Item item) {
|
||||||
|
return this.mOnItemGestureListener.onItemSingleTapUp(index, item);
|
||||||
|
}
|
||||||
|
|
||||||
|
private final ActiveItem mActiveItemSingleTap = new ActiveItem() {
|
||||||
@Override
|
@Override
|
||||||
public boolean run(final int index) {
|
public boolean run(final int index) {
|
||||||
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
|
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
|
||||||
if (that.mOnItemGestureListener == null) {
|
if (that.mOnItemGestureListener == null) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
return onSingleTapUpHelper(index, that.mItemList.get(index), mMapView);
|
return onSingleTapUpHelper(index, that.mItemList.get(index));
|
||||||
}
|
}
|
||||||
})) || super.onSingleTapUp(event);
|
};
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @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);
|
|
||||||
}
|
|
||||||
|
|
||||||
@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");
|
protected boolean onLongPressHelper(final int index, final Item item) {
|
||||||
|
return this.mOnItemGestureListener.onItemLongPress(index, item);
|
||||||
|
}
|
||||||
|
|
||||||
return (activateSelectedItems(event, new ActiveItem() {
|
private final ActiveItem mActiveItemLongPress = new ActiveItem() {
|
||||||
@Override
|
@Override
|
||||||
public boolean run(final int index) {
|
public boolean run(final int index) {
|
||||||
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
|
final ItemizedIconOverlay<Item> that = ItemizedIconOverlay.this;
|
||||||
@ -161,12 +157,7 @@ public class ItemizedIconOverlay<Item extends OverlayItem> extends ItemizedOverl
|
|||||||
}
|
}
|
||||||
return onLongPressHelper(index, getItem(index));
|
return onLongPressHelper(index, getItem(index));
|
||||||
}
|
}
|
||||||
})) || super.onLongPress(event);
|
};
|
||||||
}
|
|
||||||
|
|
||||||
protected boolean onLongPressHelper(final int index, final Item item) {
|
|
||||||
return this.mOnItemGestureListener.onItemLongPress(index, item);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* 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
|
||||||
@ -180,24 +171,36 @@ 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;
|
||||||
|
|
||||||
|
//Log.d(TAG, item.getTitle() + " " + mItemPoint + " " + dx + "/" + dy);
|
||||||
|
|
||||||
double d = dx * dx + dy * dy;
|
double d = dx * dx + dy * dy;
|
||||||
|
|
||||||
// squared dist: 50*50 pixel
|
// squared dist: 50*50 pixel
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user