android - MapView 中的 OnTouch 仅在第一次触发

标签 android event-handling android-mapview ontouchlistener

我正在尝试在我的 MapView 中实现类似双击缩放的功能。该事件总是在第一次触发,但以后不会触发。下面是我的代码。我感觉这与第一次触发事件后 map Controller 丢失有关。

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,从而在触发事件时获取 Controller 。但是,我得到了第一个事件被触发但后续事件没有被触发的相同结果。

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。

我不明白为什么事件在这种情况下会正确触发,但在我之前的实现中却不会。

最佳答案

如果您正在使用此方法 "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;
    }
}

关于android - MapView 中的 OnTouch 仅在第一次触发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3664554/

相关文章:

c++ - com 端口中的事件处理

java - 暂停方法的执行,直到回调完成

android - 如何在 Android Studio 中将库导出到 Jar?

android - 使用 ndk 工具链为 android 编译的 libpcap 静态链接错误

javascript - 如何在事件处理程序中获取 javascript 事件对象?

jquery - 防止一个 jQuery 事件与另一个事件发生

android - MapView 标记阴影

Android 在具有两个点的 map View 上绘制路线

android - setContentView 花费太多时间

java - 在 Android 中使用 Gmail API 和 OAuth2 检查来自 Gmail 的新电子邮件