#android #android-mapview #hittest #touch-event #osmdroid
#Android #android-mapview #hittest #сенсорное событие #osmdroid
Вопрос:
Я пытался реализовать onTouchEvent, чтобы я мог реагировать, когда пользователь перемещает (перетаскивает) элемент overlayitem.
Я нашел нечто подобное на сайте Osmdroid: http://code.google.com/p/osmdroid/issues/detail?id=225 . Я использую код там в качестве ссылки, но он по-прежнему не работает для меня, а затем мое приложение выходит из строя, когда оно достигает критического значения.
Есть предложения? Спасибо.
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 amp;amp; inDrag != null) {
//dragImage.setVisibility(View.VISIBLE);
setDragImagePosition(x, y);
System.out.println("Action Move!");
result = true;
}
else if (action == MotionEvent.ACTION_UP amp;amp; 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 amp;amp; (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);
}
Ответ №1:
Я получил приведенный выше код. Я заметил только две вещи, отличающиеся между моим рабочим кодом и вашим. Один из них — самые популярные параметры, которые вы отправляете, попробуйте изменить
if (hitTest(item, defaultMarker, x - p.x, y - p.y)) {
Для
if (hitTest(item, defaultMarker, t.x - p.x, t.y - p.y)) {
Во-вторых, вы должны раскомментировать pj.fromMapPixels(x, y, t);
также вам, вероятно, следует раскомментировать, dragImage.setVisibility(View.VISIBLE);
если вы хотите видеть изображение при его перетаскивании