2010-09-08 48 views
6

Tôi đang cố gắng triển khai chức năng phóng to thu nhỏ bằng hai lần nhấn trong MapView của mình. Sự kiện này luôn cháy lần đầu tiên, nhưng không bao giờ lần sau. Dưới đây là mã của tôi. Tôi có cảm giác nó có liên quan đến bộ điều khiển bản đồ bị mất sau lần đầu tiên sự kiện được kích hoạt.OnTouch trong MapView chỉ kích hoạt lần đầu tiên

import android.os.Bundle; 
import android.view.MotionEvent; 
import android.view.View; 
import android.view.View.OnTouchListener; 
import com.google.android.maps.MapActivity; 
import com.google.android.maps.MapController; 
import com.google.android.maps.MapView; 

public class mainmap extends MapActivity implements OnTouchListener{ 

    long lasttime = -1; 
    MapController mapc; 

    @Override 
    public void onCreate(Bundle savedInstanceState) { 
     super.onCreate(savedInstanceState); 
     setContentView(R.layout.main); 
     MapView mapView = (MapView) findViewById(R.id.mapview); 
     mapView.setBuiltInZoomControls(true); 
     mapc = mapView.getController(); 
     mapView.setOnTouchListener(this);  
    } 

    @Override 
    protected boolean isRouteDisplayed() { 
     // TODO Auto-generated method stub 
     return false; 
    } 

    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

      if(event.getEventTime()-lasttime<2000){ 
       mapc.zoomInFixing((int)event.getX(),(int)event.getY());    
      } 
     }  
     lasttime=event.getEventTime(); 
     return true; 
    } 

    } 

Tôi cũng đã thử chỉnh sửa phương pháp OnTouch để truyền Chế độ xem đến vào MapView, nhận bộ điều khiển trong khi sự kiện được kích hoạt. Tuy nhiên, tôi nhận được kết quả tương tự khi sự kiện đầu tiên được kích hoạt nhưng không phải là sự kiện tiếp theo.

public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

      if(event.getEventTime()-lasttime<2000){ 
       ((MapView)v).getController().zoomInFixing((int)event.getX(), (int)event.getY());     
      } 
     }  
     lasttime=event.getEventTime(); 
     return true; 
    } 

Làm càng cơ bản càng tốt, tôi cắt bỏ tất cả mã trong phương pháp OnTouch và lập trình để chỉ hiển thị thông báo bánh mì nướng nhỏ.

public boolean onTouch(View v, MotionEvent event) { 
     if (event.getAction() == MotionEvent.ACTION_DOWN){ 

       Toast.makeText(this,"Down!",Toast.LENGTH_SHORT).show(); 

     }  

     return true; 
} 

Điều này hoạt động như mong đợi, hiển thị Bánh mì nướng mỗi lần chạm MapView.

Tôi không hiểu tại sao sự kiện sẽ kích hoạt đúng trong trường hợp này nhưng không phải trong lần triển khai trước đó của tôi.

Trả lời

0

Cách sử dụng GestureDetector.OnDoubleTapListener thay vì OnTouchListener?

+0

Cảm ơn đề xuất của bạn. Tôi sẽ cố gắng triển khai OnDoubleTapListener để xử lý chức năng này thay thế. Tôi vẫn còn bối rối. Tôi hiểu OnDoubleTapListener có lẽ là cách tốt nhất để xử lý việc này, nhưng mã tôi đăng trong lý thuyết phải hoạt động, đúng không? – amandion

0

bạn ít nhất nên đặt

lasttime=event.getEventTime(); 

dưới

if (event.getAction() == MotionEvent.ACTION_DOWN) brakes 

khi onTouch phát hiện ACTION_UP trường hợp nhấp chuột của bạn. Vì vậy, bất kỳ khi nào bạn nhấp vào, nó được gọi là 2 lần

1

Tôi gặp sự cố tương tự - Tôi không thể kéo và cuộn bản đồ vì nó chỉ nhận được sự kiện ACTION_DOWN. Nó có thể được giải quyết bằng cách thêm android:clickable="true" vào MapView hoặc bằng cách gọi mapView.setClickable(true).

+0

không, OnTouchListener + OnClickListener không hoạt động: ( – djdance

15

Nếu bạn đang sử dụng phương pháp này "mapView.setBuiltInZoomControls(true);" thì touch của bạn hoạt động cùng một lúc.

Hãy loại bỏ dòng và kiểm tra tôi chắc chắn nó sẽ làm việc ..

Trong một số trường hợp nếu bạn muốn BuiltInZoomControls sau đó bạn có thể bạn phương pháp OnTouch của Overlay như như dưới đây ..

public class MapOverlay extends Overlay { 

    public MapOverlay(Context ctx) {super(ctx);} 

    @Override 
    protected void draw(Canvas c, MapView osmv, boolean shadow) { } 

    @Override 
    public boolean onTouchEvent(MotionEvent e, MapView mapView) { 
     //Write yout touch code here.. 
     return false; 
    } 
} 
+0

Đó là sự thật, nhưng tại sao sự kiện liên lạc được gọi là một lần? – Nik

+0

Tôi đã không lãng phí thời gian của tôi vào nó, vì vậy tôi không biết về nó.Tôi nghĩ rằng không cần buildInZoom Nút bcz bản đồ đã hỗ trợ phóng to cảm ứng đa điểm và bạn cũng có thể thêm nút tùy chỉnh để phóng to/thu nhỏ .. –

+0

Làm thế nào trong lớp Lớp phủ liên quan đến vấn đề này - mapView và các điều khiển thu phóng? – Ixx

-1

Thay vào đó, hãy triển khai sự kiện Chạm trên chế độ xem bản đồ. Điều đó sẽ làm việc !!

// The onTouch event of the Map itself does not fire! 
    // We must implement it on the mapView!!! 
    mapView.setOnTouchListener(new OnTouchListener() 
    { 
     public boolean onTouch(View v, MotionEvent event) 
     { 
      // Your code and remember to return true!     

      return (true); 
     } 
    }); 
+0

doesnt work dude – Nezam

1

Lớp con MapView và công cụ ghi đèTouchEvent như dưới đây và sử dụng phân lớp thay thế.

public class MyMap extends MapView{ 
@Override 
    public boolean dispatchTouchEvent(MotionEvent ev) { 
     if (mOnMovedListener!= null) { 
       mOnMovedListener.onMove(ev); 
      } 
      return super.dispatchTouchEvent(ev); 
     } 
    private OnMovedListener mOnMovedListener; 

    public void setOnMovedListener(OnMovedListener mOnMovedListener) { 
     this.mOnMovedListener= mOnMovedListener; 
    } 
} 

đăng ký cho người nghe như bất kỳ người nào khác!

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