Я пытался реализовать OnTouchEvent, чтобы я мог реагировать, когда пользователь перемещает (перетаскивает) элемент наложения.
Я нашел что-то похожее на сайте Osmdroid: http://code.google.com/p/osmdroid/issues/detail?id=225. Я использую код в качестве ссылки, но все еще не работает для меня, а затем мое приложение падает, когда попадает на hitTest.
Есть предложения? Благодарю.
public boolean onTouchEvent(MotionEvent event, MapView mapView) {
final int action = event.getAction();
final int x = (int) event.getX();
final int y = (int) event.getY();
final Projection pj = mapView.getProjection();
boolean result = false;
//Object TAG;
//Log.d(TAG, "onTouchEvent entered");
System.out.println("onTouchEvent!");
Point p = new Point(0,0);
Point t = new Point(0,0);
//System.out.print(MotionEvent.ACTION_DOWN);
//System.out.print(action);
if (action == MotionEvent.ACTION_DOWN) {
System.out.println("Action Down!");
for (OverlayItem item : mOverlays) {
// Create a new GeoPoint from pixel coordinates (x, y, pointReuse):
//pj.fromMapPixels(x, y, t);
// Convert the given GeoPoint to onscreen pixel coordinates (GeoPoint, pointOut):
pj.toPixels(item.getPoint(), p);
//System.out.println(t.x);
//System.out.println(p.x);
//System.out.println(t.y);
//System.out.println(p.y);
defaultMarker = item.getDrawable();
if (hitTest(item, defaultMarker, x - p.x, y - p.y)) {
System.out.println("Action Down -> IF!");
result = true;
inDrag = item;
mOverlays.remove(inDrag);
populate();
xDragTouchOffset = 0;
yDragTouchOffset = 0;
setDragImagePosition(x, y);
dragImage.setVisibility(View.VISIBLE);
xDragTouchOffset = t.x - p.x;
yDragTouchOffset = t.y - p.y;
break;
}
}
}
else if (action == MotionEvent.ACTION_MOVE && inDrag != null) {
//dragImage.setVisibility(View.VISIBLE);
setDragImagePosition(x, y);
System.out.println("Action Move!");
result = true;
}
else if (action == MotionEvent.ACTION_UP && inDrag != null) {
dragImage.setVisibility(View.GONE);
GeoPoint pt = (GeoPoint) pj.fromPixels(x - xDragTouchOffset, y - yDragTouchOffset);
OverlayItem toDrop = new OverlayItem(inDrag.getTitle(),
inDrag.getSnippet(), pt);
mOverlays.add(toDrop);
populate();
inDrag = null;
result = true;
pj.fromMapPixels(x, y, t);
if((t.x - p.x) == xDragTouchOffset && (t.y - p.y) == yDragTouchOffset) {
System.out.println ("Do something here if desired because we didn't move item " + toDrop.getTitle() );
}
System.out.println("Action Up!");
}
System.out.print(inDrag);
return (result || super.onTouchEvent(event, mapView));
}
private void setDragImagePosition(int x, int y) {
RelativeLayout.LayoutParams lp=
(RelativeLayout.LayoutParams)dragImage.getLayoutParams();
lp.setMargins(x-xDragImageOffset-xDragTouchOffset,
y-yDragImageOffset-yDragTouchOffset, 0, 0);
dragImage.setLayoutParams(lp);
}