MapView中的OnTouch仅在第一次触发

时间:2010-09-08 03:59:54

标签: android event-handling android-mapview ontouchlistener

我正在尝试在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方法,将传入的View转换为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时都会显示Toast。

我不明白为什么在这种情况下事件会正常发生,但在我之前的实施中却没有。

6 个答案:

答案 0 :(得分:13)

如果您使用此方法"mapView.setBuiltInZoomControls(true);",那么您的touch即可正常使用。

请删除该行并检查我确定它会起作用..

在某些情况下,如果您想要BuiltInZoomControls,那么您可以使用Overlay的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 :(得分:1)

我遇到了同样的问题 - 我无法拖动和滚动地图,因为它只接收ACTION_DOWN个事件。可以通过将android:clickable="true"添加到MapView或致电mapView.setClickable(true)来解决此问题。

答案 2 :(得分:1)

Subclass 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;
    }
}

像其他人一样注册听众!

答案 3 :(得分:0)

如何使用GestureDetector.OnDoubleTapListener代替OnTouchListener

答案 4 :(得分:0)

你至少应该放

lasttime=event.getEventTime();

下的

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

onTouch检测到您点击的ACTION_UP事件。所以每次点击它都会被称为2次

答案 5 :(得分:-1)

改为在地图视图上实施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);
        }
    });