2010-07-13 47 views
5

Tôi đang tạo trò chơi trên Android và tôi cần thực hiện một số hành động nhất định khi người dùng cố gắng nhấn và giữ trên màn hình. Rất tiếc, tôi không tìm thấy bất kỳ phương pháp nào hoạt động trực tiếp với SurfaceView tùy chỉnh, hãy cho tôi biết nếu phương thức như vậy tồn tại :)Chạm dài trên bề mặt (android)

Vì vậy, tôi quyết định thử và thực hiện phát hiện cảm ứng dài từ trình xử lý sự kiện onTouch.

đây là mã của tôi:

@Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 


      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 


      }else if (event.getAction() == MotionEvent.ACTION_UP) 
      { 
       //stop timer 
       touchDuration = System.currentTimeMillis() - touchTime; 

       if (touchDuration < 800) 
       { 
        onShortTouch(event,touchDuration); 
       }else 
       { 
        onLongTouch(event,touchDuration); 
       } 
      } 
     } 

     return true; 

này hoạt động, nhưng tôi có thể phát hiện nếu báo chí là một nền báo chí dài hay không chỉ khi người dùng ngừng chạm vào điện thoại. Vì vậy, nó không chính xác những gì tôi muốn. Tôi muốn nếu một bộ đếm thời gian sẽ bắt đầu khi người dùng chạm vào màn hình lần đầu tiên sau đó 800 ms đã trôi qua, phương thức LongTouch() được gọi. Nói cách khác, tôi không muốn phải kiểm tra thời gian trôi qua khi ACTION_UP kể từ ACTION_DOWN. Tôi tin rằng tôi nên sử dụng một thread cho bộ đếm thời gian nói nhưng tôi không thể làm cho nó hoạt động. Khi sử dụng mã sau, thông báo gỡ lỗi được hiển thị ngay sau khi tôi chạm vào màn hình:

 @Override 
    public boolean onTouch(View v, MotionEvent event) 
    { 
     long touchDuration = 0; 

      TouchThread touchThread = new TouchThread(); 

      if (event.getAction() == MotionEvent.ACTION_DOWN) 
      { 
       //Start timer 
       touchTime = System.currentTimeMillis(); 
       touchThread.setEvent(event); 
       touchThread.run(); 
      } 

     return true; 
    } 


    private class TouchThread extends Thread 
    { 

      public MotionEvent event = null; 

      public void setEvent(MotionEvent e) 
      { 
       event = e; 
      } 

      @Override 
      public void run() 
      { 
       long startTime = System.currentTimeMillis(); 
       long time = 0; 

       while(event.getAction() == MotionEvent.ACTION_DOWN) 
       { 
        time = System.currentTimeMillis() - startTime; 
        if(time > 800) 
        { 
         System.out.println("LOOONG CLICK!!"); 
         return; 
        } 
       } 
      } 
    } 

Có ai có ý tưởng nào không? Một giải pháp khác cũng sẽ được hoan nghênh.

Cảm ơn.

Trả lời

3

Một lựa chọn thoải mái khi bạn cũng muốn làm một số xử lý sự kiện của nhãn hiệu là lớp GestureDetector: http://developer.android.com/reference/android/view/GestureDetector.html

Làm thế nào tôi sử dụng nó là làm cho một trường hợp GestureDetector trong các nhà xây dựng, thực hiện các phương pháp Tôi quan tâm đến, và sau đó vào lúc bắt đầu của phương pháp onTouchEvent() làm điều gì đó như:

if (gestureDetector.onTouchEvent(event)) { 
     return true; 
    } 

mà sau đó có nghĩa là trong nhiều trường hợp khi một cử chỉ được phát hiện ra rằng hủy bỏ phần còn lại của việc xử lý liên lạc của bạn. Tuy nhiên, báo chí dài hơi khác một chút vì phương pháp báo chí dài không trả lại giá trị. Trong trường hợp này, tôi chỉ có một boolean một nơi nào đó mà tôi đặt khi nhấn lâu được kích hoạt mà tôi kiểm tra sau này trong phương pháp xử lý sự kiện cảm ứng nếu cần thiết.

1

Một điều bạn có thể làm là đặt OnLongClickListener trên SurfaceView của mình.

mySurfaceView.setOnLongClickListener(l); 

Sau đó, trong SurfaceView của bạn, bạn cần phải ghi đè lên onTouchEvent:

public boolean onTouchEvent(MotionEvent event) { 
    super.onTouchEvent(event); 
    return true; 
} 
3

Đó là khá dễ dàng, trên thực tế. Trong constructor của tầm nhìn của bạn, làm điều này:

setOnLongClickListener(new View.OnLongClickListener() 
{ 
    public boolean onLongClick(View v) { 
     Log.v("debug", "LONG CLICK!"); 
     return true; 
    } 
    } 
); 

Sau đó ghi đè onTouchEvent:

@Override 
    public boolean onTouchEvent(MotionEvent event) { 
     super.onTouchEvent(event); 
    } 

Và bạn đang thiết lập;).

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