双击/轻触地图缩放(Android)

5

可能是重复问题:
Android地图视图上双击缩放?

我有一个继承了MapActivityActivity,使用的是谷歌地图。
我需要通过双击来缩放地图。

有人能帮我吗?

我已经查看了以下内容,但它们并不是我要找的内容。

Android地图视图上双击缩放?

在网格布局上检测滑动手势

我发现onTouchListener只被调用一次,为什么会这样?

// set Gesture
detector = new GestureDetector(new GestureReactor());
mapView.setOnTouchListener(new OnTouchListener() {
    @Override
    public boolean onTouch(View v, MotionEvent event) {
        System.out.println("Inside onTouch");
        return detector.onTouchEvent(event);
    }
});

我有私有类:

private class GestureReactor extends SimpleOnGestureListener {
    @Override
    public boolean onDoubleTap(MotionEvent e) {
        System.out.println("inside onDouble");
        controller.zoomInFixing((int) e.getX(), (int) e.getY());
        return super.onDoubleTap(e);
    }
}

并且

private GestureDetector detector;

那么你在寻找什么呢?因为这些链接可以完成你要求的功能。 - iarwain01
不,他们谈论的是onFling。*// - Varand Pezeshkian
3
使用onDoubleTap而不是onFling对于程序员来说应该是非常容易的转换,对吗? - WarrenFaith
尝试这个 - futtetennista
是的,你说得对,我有一会儿忘记了我是个程序员。 - Varand Pezeshkian
6个回答

3

我也一直在寻找答案/示例,但没有找到可用的代码。

最终,这是对我有用的代码:

MyMapActivity.java

public class MyMapActivity extends MapActivity implements OnGestureListener,
OnDoubleTapListener{

private MapView mapView;

@Override
public void onCreate(Bundle savedInstanceState) {

    requestWindowFeature(Window.FEATURE_NO_TITLE);
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main);
    mapView = (MapView)findViewById(R.id.mapView);

}
@Override
public boolean onDoubleTap(MotionEvent e) {
     int x = (int)e.getX(), y = (int)e.getY();;  
     Projection p = mapView.getProjection();  
     mapView.getController().animateTo(p.fromPixels(x, y));
     mapView.getController().zoomIn();  
  return true; 
}
//Here will be some autogenerated methods too

OnDoubleTap.java

public class OnDoubleTap extends MapView {

  private long lastTouchTime = -1;

  public OnDoubleTap(Context context, AttributeSet attrs) {

    super(context, attrs);
  }

  @Override
  public boolean onInterceptTouchEvent(MotionEvent ev) {

    if (ev.getAction() == MotionEvent.ACTION_DOWN) {

      long thisTime = System.currentTimeMillis();
      if (thisTime - lastTouchTime < 250) {

        // Double tap
        this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
        lastTouchTime = -1;

      } else {

        // Too slow 
        lastTouchTime = thisTime;
      }
    }

    return super.onInterceptTouchEvent(ev);
  }
}

main.xml

<?xml version="1.0" encoding="utf-8"?>
<LinearLayout xmlns:android="http://schemas.android.com/apk/res/android"
    android:orientation="vertical"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent">

        <azizbekyan.andranik.map.OnDoubleTap
            android:id="@+id/mapView"
            android:layout_width="fill_parent"
            android:layout_height="fill_parent"
            android:enabled="true"
            android:clickable="true"
            android:apiKey="YOUR_API_KEY" />        
</LinearLayout>

不要忘记将 android:apiKey 的值替换为您自己的apiKey

3

我和bbodenmiller遇到了同样的问题,一切都很好,直到我需要转换成新建的类。mapView = (MyMapView) findViewById(R.id.mapview);会一直抛出异常。

解决方法是更改XML布局,在其中显示自定义的MapView。当您使用普通的MapView时,XML布局如下:

<?xml version="1.0" encoding="utf-8"?>
<com.google.android.maps.MapView
    xmlns:android="http://schemas.android.com/apk/res/android"
    android:id="@+id/mapview"
    android:layout_width="fill_parent"
    android:layout_height="fill_parent"
    android:clickable="true"
    android:apiKey="Hidden for obvious reasons"
/>

问题在于"com.google.android.maps.MapView"将视图定义为特定的MapView。相反,您需要使用自定义的MapView来定义它。最终看起来更像是这样。
<?xml version="1.0" encoding="utf-8"?>
<jocquej.PackageName.MyMapView
    ...
/>

3

由于您需要复制粘贴的答案,请查看这里

编辑:

在我的public class MainMap extends MapActivity中,我有一个叫做private MyMapView mv;的字段。

然后我创建了一个继承MapView的类,如下所示:public class MyMapView extends MapView

所以你只需创建一个新类,它extends MapView,将你在链接中找到的代码复制并粘贴到其中,然后在你的class中使用你的新类,这个class继承MapActivity


1
首先,让我感谢您的帮助。其次,您是如何发现我在寻找复制粘贴代码的呢?第三,让我告诉您,在经过3.15小时的搜索和尝试后,有一个小问题还是很好的。 - Varand Pezeshkian
还有其他建议吗?我的类是从MapActivity扩展的。 - Varand Pezeshkian
1
非常感谢。这也很有帮助。 - Varand Pezeshkian
链接失效了,朋友。"Posterous Spaces不再可用" - Odaym

3

链接失效了,朋友。“Posterous Spaces不再可用。” - Odaym

3

我喜欢这种通过使用自定义视图来扩展MapView并在整个应用程序中使用的解决方案。 MapView具有拦截触摸手势的功能,您可以使用此功能进行双击操作。 如果您的应用程序中有多个地图,则这是保持DRY的好方法。

import android.content.Context;
import android.util.AttributeSet;
import android.view.MotionEvent;
import android.view.ViewConfiguration;

import com.google.android.maps.MapView;

public class MyMapView extends MapView {
    private long lastTouchTime = -1;

    public MyMapView(Context context, AttributeSet attrs) {
        super(context, attrs);
    }

    @Override
    public boolean onInterceptTouchEvent(MotionEvent ev) {
        if (ev.getAction() == MotionEvent.ACTION_DOWN) {
            long thisTime = System.currentTimeMillis();
            if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) {
                // Double tap
                this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
                lastTouchTime = -1;
            } else {
                // Too slow :)
                lastTouchTime = thisTime;
            }
        }

        return super.onInterceptTouchEvent(ev);
    }
}

来自这个人的文章


0

我无法像其他人那样成功地使用http://nocivus.posterous.com/double-clicktap-detection-on-a,因为它不允许我转换mapView = (MyMapView) findViewById(R.id.mapview);。话虽如此,我得到的最佳解决方案是基于Double Tap Zoom in GoogleMaps Activity的答案:

myLocationOverlay = new MyLocationOverlay(this, mapView);

MyItemizedOverlay itemizedOverlay = new MyItemizedOverlay() {
    private long systemTime = System.currentTimeMillis();

    @Override
    public boolean onTouchEvent(MotionEvent event, MapView mapView) {
        switch (event.getAction()) {
        case MotionEvent.ACTION_DOWN:
            if ((System.currentTimeMillis() - systemTime) < ViewConfiguration.getDoubleTapTimeout()) {
                mapController.zoomInFixing((int) event.getX(), (int) event.getY());
            }
            break;
        case MotionEvent.ACTION_UP:
            systemTime = System.currentTimeMillis();
            break;
        }

        return false;
    }
};

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接