2012-11-27 39 views
8

Tôi đang phát triển ứng dụng Trình mô phỏng truyền hình từ xa trong Android bằng cách sử dụng phần mềm trung gian cụ thể (không quan trọng).Làm thế nào để làm điều gì đó nhiều lần trong khi nhấn một nút?

Trong trường hợp các nút âm lượng (Âm lượng + và Âm lượng), những gì tôi đang cố làm là gửi tín hiệu "Tăng âm lượng" liên tục trong khi nhấn nút.

Đó là những gì tôi đã cố gắng cuối cùng (mã cho một trong các nút, người kia phải giống hệt nhau ngoại trừ tên):

  1. khai báo một boolean biến

    boolean pressedUp = false; 
    
  2. khai báo một lớp bên trong với AsyncTask sau:

    class SendVolumeUpTask extends AsyncTask<Void, Void, Void> { 
    
        @Override 
        protected Void doInBackground(Void... arg0) { 
         while(pressedUp) { 
          SendVolumeUpSignal(); 
        } 
        return null; 
    } 
    

    }

  3. Thêm người nghe vào nút:

    final Button buttonVolumeUp = (Button) findViewById(R.id.volup); 
    buttonVolumeUp.setOnTouchListener(new View.OnTouchListener() { 
    
        @Override 
        public boolean onTouch(View v, MotionEvent event) { 
         switch (event.getAction()) { 
    
         case MotionEvent.ACTION_DOWN: 
    
          if(pressedUp == false){ 
           pressedUp = true; 
           new SendVolumeUpTask().execute(); 
          } 
    
         case MotionEvent.ACTION_UP: 
    
          pressedUp = false; 
    
        } 
         return true; 
        } 
    }); 
    

Tôi cũng đã thử với chủ đề đơn giản như trong Increment-Decrement counter while button is pressed nhưng không phải làm việc. Ứng dụng hoạt động tốt cho các nút còn lại (kênh, v.v.), nhưng thay đổi âm lượng hoàn toàn bị bỏ qua.

Trả lời

3

Bạn quên thêm dấu ngắt; vào cuối của MotionEvent.ACTION_DOWN: trường hợp. Điều đó có nghĩa là dòng pressUp = false; được thực hiện ngay cả trên hành động đó. Điều chính xác cần làm là:

@Override 
public boolean onTouch(View v, MotionEvent event) { 
    switch (event.getAction()) { 

    case MotionEvent.ACTION_DOWN: 

     if(pressedUp == false){ 
      pressedUp = true; 
      new SendVolumeUpTask().execute(); 
     } 
    break; 
    case MotionEvent.ACTION_UP: 

     pressedUp = false; 

} 
    return true; 
} 
+0

Cảm ơn, bây giờ tín hiệu được gửi đi. Tuy nhiên, nó sẽ gửi rất nhiều tín hiệu trong một khoảng thời gian ngắn. Có lẽ một bộ đếm nên hoạt động. – Truncarlos

+4

Tôi khuyên bạn nên có khoảng thời gian giữa các cuộc gọi đến SendVolumeUpSignal(); Ví dụ: hãy thử: 'while (pressedUp) { SendVolumeUpSignal(); Thread.sleep (100);} ' –

+0

Hữu ích. Cảm ơn: D – Truncarlos

2

Bạn đã xem

  • Bắt đầu nhiệm vụ repititive của bạn trên onKeyDown kiện
  • Dừng nhiệm vụ trên các sự kiện onKeyUp ?
+1

Không phải những phương pháp đó cho các phím vật lý của thiết bị phải không? Tôi có nghĩa là xúc giác trong các ứng dụng từ xa của tôi – Truncarlos

+0

yeah, tên cho thấy như vậy .. nhưng họ không phải :-) –

+0

Dù sao, câu trả lời trước đã giúp tôi đủ, cảm ơn: D – Truncarlos

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