2010-03-29 34 views
11

Lớp học của tôi mở rộng Xem và tôi cần nhận các sự kiện liên lạc liên tục trên đó.Làm thế nào để có được một sự kiện liên lạc liên tục?

Nếu tôi sử dụng:

public boolean onTouchEvent(MotionEvent me) { 

    if(me.getAction()==MotionEvent.ACTION_DOWN) { 
     myAction(); 
    } 
    return true; 
} 

... sự kiện liên lạc được chụp một lần.

Nếu tôi cần chạm liên tục mà không cần di chuyển ngón tay thì sao? Xin vui lòng, cho tôi biết tôi không cần sử dụng chủ đề hoặc bộ hẹn giờ. Ứng dụng của tôi đã quá nặng.

Cảm ơn.

Trả lời

15

Sử dụng if(me.getAction() == MotionEvent.ACTION_MOVE). Không thể giữ ngón tay 100% hoàn toàn trên màn hình để Action_Move sẽ được gọi mỗi lần di chuyển ngón tay, ngay cả khi nó chỉ là một hoặc hai điểm ảnh.

Bạn cũng có thể nghe me.getAction() == MotionEvent.ACTION_UP - cho đến khi điều đó xảy ra, người dùng vẫn phải có ngón tay trên màn hình.

+2

Đúng, tôi muốn các giải pháp để thiết lập một lá cờ trên ACTION_DOWN và sử dụng cho đến khi lá cờ được thiết lập sai trên ACTION_UP – WarrenFaith

+0

Thực sự cảm ơn bạn. – daliz

+0

Tôi thấy điều này được đề cập ở khắp mọi nơi nhưng nó không có vẻ là trường hợp đối với tôi. Nếu tôi chạm và giữ và giữ nguyên, tôi không nhận được sự kiện ACTION_MOVE. ACTION_MOVE dường như chỉ kích hoạt nếu tôi nghiêng ngón tay của tôi theo cách này hay cách khác. Nó có thể là một thiết lập trên điện thoại của tôi mà giữ nó ít nhạy cảm hơn? – clusterflux

3

Cô ấy là đoạn mã đơn giản cho thấy cách bạn có thể xử lý sự kiện chạm liên tục. Khi bạn chạm vào thiết bị và giữ liên lạc và di chuyển công cụ tìm của bạn, hành động Chạm di chuyển được thực hiện.

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    float x = event.getX(); 
    float y = event.getY(); 
    if(isTsunami){ 
    switch (event.getAction()) { 
     case MotionEvent.ACTION_DOWN: 
      // Write your code to perform an action on down 
      break; 
     case MotionEvent.ACTION_MOVE: 
      // Write your code to perform an action on contineus touch move 
      break; 
     case MotionEvent.ACTION_UP: 
      // Write your code to perform an action on touch up 
      break; 
    } 
    } 
    return true; 
} 
1

Hãy thử điều này. Nó hoạt động với tôi:

public static OnTouchListener loadContainerOnTouchListener() { 
    OnTouchListener listener = new OnTouchListener(){ 
    @Override 
    public boolean onTouch(View v, MotionEvent event) { 
     LinearLayout layout = (LinearLayout)v; 
     for(int i =0; i< layout.getChildCount(); i++) 
     { 
      View view = layout.getChildAt(i); 
      Rect outRect = new Rect(view.getLeft(), view.getTop(), view.getRight(), view.getBottom()); 
      if(outRect.contains((int)event.getX(), (int)event.getY())) 
      { 
       Log.d(this.getClass().getName(), String.format("Over view.id[%d]", view.getId())); 
      } 
     } 

    } 

Hãy nhớ: người nghe bạn sẽ đặt phải là bố cục vùng chứa (Lưới, Tương đối, Tuyến tính).

LinearLayout layout = findViewById(R.id.yourlayoutid); 
layout.setOnTouchListener(HelperClass.loadContainerOnTouchListener()); 
5

Bạn cần phải thiết lập thuộc tính này cho các phần tử android: đặt tiêu điểm = "true" android: nhấp được = "true" nếu không, chỉ cần xuất trình hành động xuống.

0

Tôi đang tạo trò chơi với chế độ xem tùy chỉnh được sử dụng làm điều khiển ngón tay cái. . . đây là những gì tôi đã làm

float x = 0, y = 0; 

@Override 
public boolean onTouchEvent(MotionEvent event) { 
    x = event.getX(); 
    y = event.getY(); 

    // handle touch events with 
    switch(event.getActionMasked()) { 
     case MotionEvent.ACTION_DOWN : 
      if(cont) 
      { 
       // remove any previous callbacks 
       removeCallbacks(contin); 

       // post new runnable 
       postDelayed(contin, 10); 
      } 
      invalidate(); 
      return true; 
     case MotionEvent.ACTION_MOVE : 
      if(!cont && thumbing != null) 
      { 
       // do non-continuous operations here 
      } 
      invalidate();  
      return true; 
     case MotionEvent.ACTION_UP : 

      // set runnable condition to false 
      x = 0; 

      // remove the callbacks to the thread 
      removeCallbacks(contin); 
      invalidate(); 
      return true; 
     default : 
      return super.onTouchEvent(event); 
    } 
} 

public boolean cont = false; 

// sets input to continuous 
public void set_continuous(boolean b) { cont = b; } 


public Runnable contin = new Runnable() 
{ 

    @Override 
    public void run() { 
     if(x != 0) 
     { 
      // do continuous operations here 
      postDelayed(this, 10); 
     } 
    } 

}; 

Tuy nhiên, Một lưu ý nhanh chóng đảm bảo các hoạt động chính của bạn cũng được gọi quan điểm này loại bỏ các callbacks bằng tay thông qua phương thức onPause như sau

@Override 
protected void onPause() { 
    if(left.cont) left.removeCallbacks(left.contin); 
    if(right.cont) right.removeCallbacks(left.contin); 
    super.onPause(); 
} 

Bằng cách đó nếu bạn tạm dừng và các sự kiện liên lạc trở lại không được xử lý hai lần và chế độ xem hoàn toàn miễn phí.

** thử nghiệm trên Samsung Galaxy S3 với khả năng tăng tốc phần cứng trên **

0

Tất cả những câu trả lời đúng một phần nhưng họ không giải quyết được một cách đúng đắn các vấn đề.

Trước hết, đối với mọi người, hãy quyết định theo dõi thời điểm sự kiện là ACTION_MOVE. Vâng mà chỉ hoạt động khi đoán? Khi người dùng di chuyển ngón tay của mình, vì vậy có thể nếu bạn quyết định thực hiện điều khiển ngón tay cái tùy chỉnh là không sao nhưng đối với nút tùy chỉnh bình thường không phải như vậy.

Thứ hai, sử dụng một lá cờ bên ACTION_DOWN và kiểm tra xem nó trong ACTION_UP vẻ như cách logic để làm điều đó, nhưng như Clusterfux tìm hiểu nếu bạn thực hiện một logic while(!up_flag) bạn gặp khó khăn vào những rắc rối;)

Vì vậy, cách đúng đắn để làm điều đó được đề cập ở đây:

Continuous "Action_DOWN" in Android

Chỉ cần ghi nhớ rằng nếu logic bạn sẽ viết trong báo chí liên tục có thay đổi giao diện người dùng một cách nào đó, bạn phải làm điều đó từ chủ đề chính trong tất cả các trường hợp khác, tốt hơn nên sử dụng một chuỗi khác.

0

Điều này có thể giúp đỡ,

requestDisallowInterceptTouchEvent(true); 

trên quan điểm phụ huynh, như thế này -

 @Override 
     public boolean onTouch(View view, MotionEvent motionEvent) { 
      view.getParent().requestDisallowInterceptTouchEvent(true); 
      switch(motionEvent.getActio){ 
      } 

      return false; 

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