Java 双击:在Android MapView上缩放?

Java 双击:在Android MapView上缩放?,java,android,android-view,android-mapview,android-touch-event,Java,Android,Android View,Android Mapview,Android Touch Event,经过一点工作后,我的路线应用程序运行良好。 我只想添加一个双击放大功能,但我不知道如何添加 您能给我一个提示吗?实现GestureListener以接收双击事件 请参阅:这里是一个很好的、切中要害的实现: (对于所有对这个问题感到烦躁的人来说,这是一个迟来的答案)我知道这是一篇老文章,但这个解决方案也很有效: 我想他已经在自己的帖子中纠正了错误,所以只需使用问题部分,而不是答案(它们很可怕:)我也在搜索答案/示例,但没有找到有效的代码 最后,以下是对我有用的代码: MyMapActivity.

经过一点工作后,我的路线应用程序运行良好。 我只想添加一个双击放大功能,但我不知道如何添加


您能给我一个提示吗?

实现GestureListener以接收双击事件


请参阅:

这里是一个很好的、切中要害的实现:


(对于所有对这个问题感到烦躁的人来说,这是一个迟来的答案)

我知道这是一篇老文章,但这个解决方案也很有效:


我想他已经在自己的帖子中纠正了错误,所以只需使用问题部分,而不是答案(它们很可怕:)

我也在搜索答案/示例,但没有找到有效的代码

最后,以下是对我有用的代码:

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
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 < ViewConfiguration.getDoubleTapTimeout()) {
        // Double tap
        this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
        lastTouchTime = -1;
      } else {
        // Too slow 
        lastTouchTime = thisTime;
      }
    }
    return super.onInterceptTouchEvent(ev);
  }
}
OnDoubleTap.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
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 < ViewConfiguration.getDoubleTapTimeout()) {
        // Double tap
        this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY());
        lastTouchTime = -1;
      } else {
        // Too slow 
        lastTouchTime = thisTime;
      }
    }
    return super.onInterceptTouchEvent(ev);
  }
}
公共类OnDoubleTap扩展了MapView{ 私有长lastTouchTime=-1; 公共OnDoubleTap(上下文、属性集属性){ 超级(上下文,attrs); } @凌驾 公共布尔值onInterceptTouchEvent(MotionEvent ev){ if(ev.getAction()==MotionEvent.ACTION\u向下){ long ThistTime=System.currentTimeMillis(); if(ThistTime-lastTouchTime 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>


不要忘记在这里用您的
apiKey
替换
android:apiKey
值,当您想要放大和缩小时,请使用以下代码

  • 双击mapview顶部的50%放大
  • 缩小双击mapview底部的50%
  • @覆盖
    公共布尔值onInterceptTouchEvent(MotionEvent ev){
    if(ev.getAction()==MotionEvent.ACTION\u向下){
    long ThistTime=System.currentTimeMillis();
    DisplayMetrics=新的DisplayMetrics();
    WindowManager wm=(WindowManager)activity.getSystemService(activity.getApplicationContext().WINDOW\u服务);
    wm.getDefaultDisplay().getMetrics(metrics);
    int height=metrics.heightPixels;
    if(ThistTime-lastTouchTimeev.getY()){
    //放大
    this.getController().zoomInFixing((int)ev.getX(),(int)ev.getY());
    }否则{
    this.getController().zoomOutFixing((int)ev.getX(),(int)ev.getY());
    //缩小
    }
    lastTouchTime=-1;
    }否则{
    //太慢
    lastTouchTime=这次;
    }
    }
    返回超级onInterceptTouchEvent(ev);
    }
    
    以防有人在寻找新谷歌地图的答案(因为谷歌Play服务:9+)

    case MotionEvent.ACTION\u向下:
    x1=m.getX();
    如果((System.currentTimeMillis()-systemTime)<200){
    mGoogleMap.animateCamera(CameraUpdateFactory.zoomIn());
    }
    systemTime=System.currentTimeMillis();
    打破
    case MotionEvent.ACTION\u UP:
    systemTime=System.currentTimeMillis();
    ...
    打破
    
    在那篇文章中没有双击为什么每个人都重定向到那个特定的线程:|
    onInterceptTouchEvent
    处理程序的源似乎是。我通过设置
    ViewConfiguration.getDoubleTapTimeout()
    改进了Andrianik的代码。