2010-07-06 2 views
2

Возможный дубликат:
Double Tap -> Zoom on Android MapView?Double Tap Увеличить GoogleMaps активность

Я новичок Android разработчик. Я разрабатываю приложение, в котором я использую GoogleMaps. Я должен реализовать двойное масштабирование в GoogleMaps. Когда я дважды нажимаю на карту, он должен увеличивать масштаб. Не забудьте, если это возможно, укажите пример кода.
Я написал следующий код, но я не знаю, что добавить еще.

public class Maps extends MapActivity implements OnGestureListener, OnDoubleTapListener { 

    private GestureDetector detector; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     // MapViewer mapViewer = new MapViewer(null, null); 
     MapView mapView = (MapView) findViewById(R.id.mapview); 
     detector = new GestureDetector(this, this); 
     mapView.setBuiltInZoomControls(true); 
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     return false; 
    } 

    public boolean onDoubleTap(MotionEvent e) { 
     mapView.getController().zoomIn(); 
     return false; 
    } 

    public boolean onDoubleTapEvent(MotionEvent e) { 
     return false; 
    } 

    public boolean onSingleTapConfirmed(MotionEvent e) { 
     return false; 
    } 

    public boolean onDown(MotionEvent e) { 
     return false; 
    } 

    public boolean onFling(MotionEvent e1, MotionEvent e2, float velocityX, float velocityY) { 
     return false; 
    } 

    public void onLongPress(MotionEvent e) { 
    } 

    public boolean onScroll(MotionEvent e1, MotionEvent e2, float distanceX, float distanceY) { 
     return false; 
    } 

    public void onShowPress(MotionEvent e) { 
    } 

    public boolean onSingleTapUp(MotionEvent e) { 
     return false; 
    } 
} 
+0

Вы можете просто вызвать mapView.getController(). ZoomIn() или zoomOut ... – Rabas

+0

вызов mapView.getController(). ZoomIn(), но где? вы можете просто отредактировать мой код, пожалуйста. – zeeshan

ответ

2
@Override 
public boolean onTouchEvent(MotionEvent event, MapView mapView) { 
    switch (event.getAction()) { 
    case MotionEvent.ACTION_DOWN: 
     if ((System.currentTimeMillis() - systemTime) < 200) { 
      mapView.getController().zoomIn(); 
     } 
     systemTime = System.currentTimeMillis(); 
     break; 
    } 

    return false; 
} 

Это будет имитировать наезд. Реализует в вашем MapOverlay (ItemizedOverlay)

0

Чтобы сделать его увеличить в резьбовом место, просто добавьте:

getController().animateTo(getProjection().fromPixels((int) ev.getX(), (int) ev.getY())); 
4

Основываясь на информации, представленной здесь и double click/tap map zoom (Android) лучшее решение, которое я получил, было:

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

case MotionEvent.ACTION_UP был добавлен в результате того, как https://developer.android.com/reference/android/view/ViewConfiguration.html#getDoubleTapTimeout() говорит, что getDoubleTapTimeout() рассчитывается. Кроме того, я изменил функцию масштабирования, так как эта функция является наименее нервной и функционирует идентично приложению «Карты».

+0

Кажется, что это путь, такой же вариант реализации, как и первый ответ, но мне больше нравятся тщательность и масштабирование. – geerlingguy

+0

Стоит отметить, что с тех пор я обнаружил, что когда пользователь выполняет панорамирование, часто часто неправильно масштабируется. У меня не было времени исправить это, но опубликую, когда я это сделаю. – bbodenmiller

0

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

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

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.

+0

Это похоже на приятный, легкий способ обнаружения двойных нажатий. Поймите, что 1) MotionEvent знает, когда он был создан, поэтому вы можете написать: 'long thisTime = event.getEventTime();'. 2) Если пользователь быстро панорамирует, это приведет к ошибке двух быстрых жестов для двойного касания (вы должны проверить, как далеко продвигаются оба события перехода). 3) Пожалуйста, не отправляйте точный ответ в нескольких вопросах, если вопросы идентичны, оставляйте комментарий или отметьте его ссылкой на дублированный вопрос. – Sam

+0

1) Получил это. 2) Да, вы тоже здесь. 3) Имейте в виду в следующий раз. – azizbekian