Невозможно реализовать onTouchEvent (перетаскивание) с помощью Osmdroid

#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); если вы хотите видеть изображение при его перетаскивании