2011-06-29 26 views
12

Tôi đang tìm một cách để khi người dùng chạm vào một bản đồ dài (cho phép nói 1000ms) rằng tôi có thể thực hiện một số hành động nhất định.Làm thế nào để xác định một liên lạc dài trên Android?

Làm cách nào để tôi đánh giá thời gian người dùng chạm vào chế độ xem bản đồ (hoặc bất kỳ chế độ xem nào).

Nó sẽ tương tự như ứng dụng bản đồ google android, khi bạn liên lạc lâu, nó sẽ trả về một mục che bóng.

Chỉnh sửa thêm

mapView.setOnLongClickListener(new View.OnLongClickListener() { 

     public boolean onLongClick(View v) { 

      Toast.makeText(mapView.getContext(), "Hello 123", 2000); 
      return false; 
     } 
    }); 

ở trên không làm việc ... bất kỳ ý tưởng tại sao?

Sửa thêm

Đây là những gì tôi đang cố gắng vào lúc này, nhưng nó dường như không làm việc, ngay cả khi tôi chỉ nhấn trên điện thoại, nó nói sự kiện này là một action_move,

i đang sử dụng một lớp bên trong MapActivity tôi

private long startTime=0; 
private long endTime=0; 

class MapOverlay extends Overlay { 



    @Override 
    public boolean onTouchEvent(MotionEvent ev, MapView mapView) { 

     if(ev.getAction() == MotionEvent.ACTION_DOWN){ 
      //record the start time 
      startTime = ev.getEventTime(); 

      Log.d("LC", "IN DOWN"); 
      }else if(ev.getAction() == MotionEvent.ACTION_UP){ 
      //record the end time 
      endTime = ev.getEventTime(); 
      Log.d("LC", "IN UP"); 
      }else if(ev.getAction() == MotionEvent.ACTION_MOVE){ 
       Log.d("LC", "IN move"); 
       endTime=0; 
      } 

      //verify 
      if(endTime - startTime > 1000){ 
      //we have a 1000ms duration touch 
      //propagate your own event 
       Log.d("LC", "time touched greater than 1000ms"); 
       Toast.makeText(getBaseContext(), "Hello 123", Toast.LENGTH_SHORT).show(); 
       startTime=0; 
       endTime=0; 
      return true; //notify that you handled this event (do not propagate) 
      } 

     return false;//propogate to enable drag 

    } 

} 

và đây là log lỗi của tôi mà không thực hiện bất kỳ ý nghĩa với tôi

06-29 14:29:55.509: DEBUG/LC(7693): IN move 
06-29 14:29:56.149: DEBUG/LC(7693): IN UP 
06-29 14:29:56.149: DEBUG/LC(7693): 6346707 6349261 
06-29 14:29:56.149: DEBUG/LC(7693): time touched greater than 1000ms 

thời gian kết thúc phải được đặt thành 0 ... nhưng không phải là ... bất kỳ ý tưởng nào tại sao?

+0

Điều này hoạt động hoàn hảo! Đây là phiên bản C#/Xamarin là ai đó cần: 'bảo vệ dài _touchStartTime; công khai ghi đè bool OnTouchEvent (MotionEvent e) {if (e.Action == MotionEventActions.Down) _touchStartTime = e.EventTime; if (e.Action == MotionEventActions.Up && e.EventTime - _touchStartTime> 1000) DoSomethingFun(); return base.OnTouchEvent (e);} ' – BayssMekanique

Trả lời

4

Có thể bạn đang tìm kiếm một nhấp chuột dài bình thường? Bạn sẽ phải đặt chế độ xem của mình thành có thể nhấp lâu bằng cách thêm android: longClickable vào chế độ xem của bạn xml hoặc bằng cách gọi setLongClickable (true). Sau đó, bạn có thể thêm OnLongClickListener vào chế độ xem. Tôi không biết cách nào để xác định chính xác thời lượng nhấp chuột dài. Tuy nhiên, nhấp chuột mặc định dài giống với nhấp chuột dài google maps mà bạn đã đề cập.

OnLongClickListener

+0

chỉnh sửa được thêm ở trên – molleman

1

sử dụng System.currentTimeMillis() thay vì ev.getEventTime();

0

Khi MotionEvent.ACTION_UP, endTime sẽ được thiết lập để ev.getEventTime(), thiết lập endTime để không làm điều này khi MotionEvent.ACTION_MOVE được không ảnh hưởng. Thay vì đặt endTime thành 0, bạn nên đặt startTime thành ev.getEventTime()

6

Đây là cách bạn thường tạo một onLongClickListener. Hãy thử điều này:

mapView.setOnLongClickListener(new OnLongClickListener() { 

     @Override 
     public boolean onLongClick(View arg0) { 

      Toast.makeText(mapView.getContext(), "Hello 123", 2000); 

      return false; 

     } 
    }); 

tham khảo để chỉnh sửa của bạn:

này có thể là cách để có được những gì bạn muốn.

private final Handler handler = new Handler(); 
private final Runnable runnable = new Runnable() { 
public void run() { 
    checkGlobalVariable(); 
} 
}; 

// Other init stuff etc... 

@Override 
public void onTouchEvent(MotionEvent event) { 
if(event.getAction() == MotionEvent.ACTION_DOWN) { 
    // Execute your Runnable after 1000 milliseconds = 1 second. 
    handler.postDelayed(runnable, 1000); 
    mBooleanIsPressed = true; 
} 

if(event.getAction() == MotionEvent.ACTION_UP) { 
    if(mBooleanIsPressed) { 
     mBooleanIsPressed = false; 
     handler.removeCallbacks(runnable); 
    } 
} 
} 

Và bây giờ bạn có thể kiểm tra với chức năng checkGlobalVariable:

if(mBooleanIsPressed == true) 

Đây là cách bạn có thể xử lý trường hợp này. Chúc may mắn.

+1

@molleman Tôi đoán ** Umitk ** cung cấp cho bạn đúng cách để thực hiện nhấp chuột dài. Mã của anh ta chính xác là cách longClock hoạt động trong chế độ xem Android gốc. –

0

Bạn có thể thiết lập longClickListener và touchListener.Thêm một biến thành viên dữ liệu lớp boolean longClicked và đặt nó thành false ban đầu. Đây là cách bạn có thể đặt longClickListener.

view.setOnLongClickListener(new View.OnLongClickListener() { 
     @Override 
     public boolean onLongClick(View v) { 
      longClicked = true; 
      return false; 
     } 
    }); 

Đối touchListener

view.setOnTouchListener(new View.OnTouchListener() { 
     @Override 
     public boolean onTouch(View v, MotionEvent event) { 
      if(longClicked){ 
       //Do whatever you want here!! 
       longClicked = false; 
      } 
      return false; 
     } 
    }); 

Nó sẽ cung cấp cho bạn những tác dụng tương tự như Google Maps bấm dài. Hy vọng nó giúp.

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