2010-04-22 3 views
2

после немного работы моего приложения маршрут работает отлично :) Единственное, что я просто хочу, чтобы добавить это двойное нажатие масштабирования в функции, но я не знаю, как ...Double Tap -> Увеличить на Android MapView?

могли бы вы дать мне Намек?

красивые поздравления, poeschlorn

ответ

1

Реализовать GestureListener получить DoubleTap события.

см: Fling gesture detection on grid layout

+1

В этом сообщении нет двойного касания, почему каждый перенаправляет на эту тему: | – Necronet

1

Старый пост, я знаю, но это решение работает тоже: double click/tap map zoom (Android)

Я думаю, он исправил его ошибки в его собственном посте, так что просто используйте вопрос, а не ответы (они ужасные :))

5

Я также искал ответ/пример, но нашел нигде рабочий код.

Наконец, вот код, который работает для меня:

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 < ViewConfiguration.getDoubleTapTimeout()) { 
     // 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.

+0

Источником обработчика 'onInterceptTouchEvent' является [этот пост в блоге] (http://nocivus.posterous.com/double-clicktap-detection-on-a). Я улучшил код Andrianik, установив 'ViewConfiguration.getDoubleTapTimeout()'. – JJD

0

Используйте следующий код, если вы хотите, чтобы увеличить и уменьшить масштаб

  1. приближать двойной щелчок на верхних 50% от MapView
  2. Увеличить из двойного щелчка на нижнем 50% MapView

@Override 
public boolean onInterceptTouchEvent(MotionEvent ev) { 
    if (ev.getAction() == MotionEvent.ACTION_DOWN) { 
     long thisTime = System.currentTimeMillis(); 

DisplayMetrics metrics = new DisplayMetrics(); 
WindowManager wm = (WindowManager) activity.getSystemService(activity.getApplicationContext().WINDOW_SERVICE); 
wm.getDefaultDisplay().getMetrics(metrics); 
int height = metrics.heightPixels; 

if (thisTime - lastTouchTime < ViewConfiguration.getDoubleTapTimeout()) { 
     // Double tap 
     if((height/2)>ev.getY()){ 
// Zoom IN 
      this.getController().zoomInFixing((int) ev.getX(), (int) ev.getY()); 
     }else{ 
      this.getController().zoomOutFixing((int) ev.getX(), (int) ev.getY()); 
//Zoom Out 
     } 
     lastTouchTime = -1; 
     } else { 
     // Too slow 
     lastTouchTime = thisTime; 
     } 
    } 
    return super.onInterceptTouchEvent(ev); 
    } 
0

В случае, если кто-то ищет ответ на новый GoogleMap (с Google-Pl ay-service: 9+)

case MotionEvent.ACTION_DOWN: 
       x1 = m.getX(); 
       if ((System.currentTimeMillis() - systemTime) < 200) { 
        mGoogleMap.animateCamera(CameraUpdateFactory.zoomIn()); 
       } 
       systemTime = System.currentTimeMillis(); 
       break; 
case MotionEvent.ACTION_UP: 
       systemTime = System.currentTimeMillis(); 
       ... 
       break; 
Смежные вопросы