2011-01-26 24 views
11

Tôi có một MapView trong một hoạt động và nó hoạt động tốt, bản đồ cho thấy, và nó phản ứng với vòi, và tôi có thể trích xuất các vị trí một cách dễ dàng. Tuy nhiên, trình xử lý này cũng phản hồi việc thu nhỏ, vì vậy nếu người dùng cố gắng thu nhỏ, ứng dụng sẽ phản hồi như thể họ đã nhấn vào (và điều này rất khó hiểu đối với họ).Làm cách nào để tôi phản hồi với một lần chạm trên MapView trên Android nhưng bỏ qua việc thu phóng bằng pinch?

Làm cách nào tôi có thể trả lời các lần nhấn trên MapView và chỉ nhận một lần nhấn, đặc biệt bỏ qua chụm-thu nhỏ và nhấn đúp?

Tôi có cần sử dụng OnTouchEvent() thay vì OnTap() không? Nếu vậy, làm cách nào để phân biệt giữa các sự kiện chạm khác nhau và cách truy cập GeoPoint?

Dưới đây là đoạn code từ bên MapActivity tôi:

class MapOverlay extends com.google.android.maps.Overlay 
{ 
    @Override 
    public boolean onTap(GeoPoint p, MapView map) 
    { 
     if (p!=null) 
     { 
      // Do stuff with the geopoint 
      return true;         // We handled the tap 
     } 
     else 
     { 
      return false;        // We didn't handle the tap 
     } 
    } 
} 
+0

Bạn có thể tiếp tục sử dụng onTap, được thiết kế để chỉ phản hồi khi các mục lớp phủ được chạm vào (trái ngược với bất kỳ vị trí nào trên bản đồ) và vẫn đặt trình nghe chạm trên MapView để bỏ qua pinch, như điều này: http://stackoverflow.com/questions/4626028/how-to-disable-pinch-in-android-mapview –

+0

Thú vị khi kéo bản đồ là tốt. do đó Drag không kích hoạt onTap() nhưng chạm vào (như mong đợi) nhưng cũng pinch & zoom. Đó không phải là điều tôi mong đợi. –

+0

Tôi không muốn tắt tính năng thu nhỏ và thu phóng, tôi muốn nó hoạt động, tôi cũng chỉ muốn ứng dụng của tôi cũng nhận được onTap. –

Trả lời

27

Sau nhiều đầu gãi và cố gắng tiếp cận khác nhau, chương trình này đang làm việc tốt cho đến nay. Mã theo sau các sự kiện chuyển động. Khi chúng tôi nhận được sự kiện ACTION_DOWN, nó đánh dấu cờ isPinch là sai (chúng tôi không biết nếu nó là một pinch hay chưa), nhưng ngay sau khi chúng tôi nhận được một sự kiện cảm ứng (tức là ACTION_MOVE) liên quan đến hai ngón tay, isPinch được đặt thành đúng, và như vậy khi sự kiện onTap() kích hoạt, nó có thể thấy nếu có một pinch hay không.

class MapOverlay extends com.google.android.maps.Overlay 
{ 
private boolean isPinch = false; 

@Override 
public boolean onTap(GeoPoint p, MapView map){ 
    if (isPinch){ 
     return false; 
    }else{ 
     Log.i(TAG,"TAP!"); 
     if (p!=null){ 
      handleGeoPoint(p); 
      return true;   // We handled the tap 
     }else{ 
      return false;   // Null GeoPoint 
     } 
    } 
} 

@Override 
public boolean onTouchEvent(MotionEvent e, MapView mapView) 
{ 
    int fingers = e.getPointerCount(); 
    if(e.getAction()==MotionEvent.ACTION_DOWN){ 
     isPinch=false; // Touch DOWN, don't know if it's a pinch yet 
    } 
    if(e.getAction()==MotionEvent.ACTION_MOVE && fingers==2){ 
     isPinch=true; // Two fingers, def a pinch 
    } 
    return super.onTouchEvent(e,mapView); 
} 

} 
+0

Tuyệt vời! Chính xác những gì tôi đang tìm kiếm. Tôi sẽ cho bạn +2! :) – Kimi

+0

+1 hoàn hảo, cảm ơn :) – Dori

+0

Cảm ơn bạn, tôi đã tìm thấy câu hỏi này ngay cả trước khi tôi nhận ra tôi có cùng một vấn đề! Rất vui khi có giải pháp ngay lập tức =) –

Các vấn đề liên quan