OnTouch в MapView срабатывает только в первый раз - PullRequest
6 голосов
/ 08 сентября 2010

Я пытаюсь реализовать функцию двойного касания в моем MapView. Событие всегда запускается в первый раз, но никогда в последующие. Ниже мой код. У меня такое ощущение, что это как-то связано с потерей контроллера карты после первого запуска события.

import android.os.Bundle;
import android.view.MotionEvent;
import android.view.View;
import android.view.View.OnTouchListener;
import com.google.android.maps.MapActivity;
import com.google.android.maps.MapController;
import com.google.android.maps.MapView;

public class mainmap extends MapActivity implements OnTouchListener{

    long lasttime = -1;
    MapController mapc;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        MapView mapView = (MapView) findViewById(R.id.mapview);
        mapView.setBuiltInZoomControls(true);
        mapc = mapView.getController();
        mapView.setOnTouchListener(this);       
    }

    @Override
    protected boolean isRouteDisplayed() {
        // TODO Auto-generated method stub
        return false;
    }

    @Override
    public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){

            if(event.getEventTime()-lasttime<2000){
                mapc.zoomInFixing((int)event.getX(),(int)event.getY());             
            }
        }       
        lasttime=event.getEventTime();
        return true;
    }

  }

Я также попытался отредактировать метод OnTouch для приведения входящего вида в MapView, получая контроллер во время запуска события. Тем не менее, я получаю те же результаты, когда запускается первое событие, но не последующие.

public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){

            if(event.getEventTime()-lasttime<2000){
                ((MapView)v).getController().zoomInFixing((int)event.getX(), (int)event.getY());                
            }
        }       
        lasttime=event.getEventTime();
        return true;
    }

Будучи как можно более простым, я вырезал весь код в методе OnTouch и запрограммировал его так, чтобы он просто отображал маленькое сообщение с тостами.

public boolean onTouch(View v, MotionEvent event) {
        if (event.getAction() == MotionEvent.ACTION_DOWN){

               Toast.makeText(this,"Down!",Toast.LENGTH_SHORT).show();

        }       

        return true;
}

Это работает, как и ожидалось, отображая тост при каждом прикосновении к MapView.

Я не понимаю, почему событие сработает правильно в этом случае, но не в моей предыдущей реализации.

Ответы [ 6 ]

13 голосов
/ 05 марта 2012

Если вы используете этот метод "mapView.setBuiltInZoomControls(true);", тогда ваш touch работает сразу.

Пожалуйста, удалите эту строку и убедитесь, что она будет работать ..

В некоторых случаях, если вам нужны BuiltInZoomControls, вы можете использовать метод наложения OnTouch, как показано ниже.

public class MapOverlay extends Overlay {

    public MapOverlay(Context ctx) {super(ctx);}

    @Override
    protected void draw(Canvas c, MapView osmv, boolean shadow) { }

    @Override
    public boolean onTouchEvent(MotionEvent e, MapView mapView) {
        //Write yout touch code here..
        return false;
    }
}
1 голос
/ 21 июля 2014

Создайте подкласс MapView, переопределите dispatchTouchEvent, как показано ниже, и используйте вместо этого подкласс.

public class MyMap extends MapView{
@Override
    public boolean dispatchTouchEvent(MotionEvent ev) {
         if (mOnMovedListener!= null) {
                mOnMovedListener.onMove(ev);
            }
            return super.dispatchTouchEvent(ev);
        }
    private OnMovedListener mOnMovedListener;

    public void setOnMovedListener(OnMovedListener mOnMovedListener) {
        this.mOnMovedListener= mOnMovedListener;
    }
}

зарегистрируйтесь для слушателя, как и любой другой!

1 голос
/ 27 февраля 2011

У меня была такая же проблема - я не мог перетащить и прокрутить карту, потому что она получала только ACTION_DOWN событий. Это можно решить, добавив android:clickable="true" к MapView или вызвав mapView.setClickable(true).

0 голосов
/ 08 мая 2012

Вместо этого реализуйте событие Touch на виде карты. Это будет работать !!

    // The onTouch event of the Map itself does not fire!
    // We must implement it on the mapView!!!
    mapView.setOnTouchListener(new OnTouchListener()
    {
        public boolean onTouch(View v, MotionEvent event) 
        {
            // Your code and remember to return true!                

            return (true);
        }
    });
0 голосов
/ 02 декабря 2010

вы должны хотя бы поставить

lasttime=event.getEventTime();

под

if (event.getAction() == MotionEvent.ACTION_DOWN) brakes 

пока onTouch обнаружит ACTION_UP событие вашего клика. Поэтому каждый раз, когда вы делаете клик, это называется 2 раза

0 голосов
/ 08 сентября 2010

Как насчет использования GestureDetector.OnDoubleTapListener вместо OnTouchListener?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...