2010-11-16 63 views
18

) Tôi đang trong quá trình tạo trò chơi trí nhớ. Vấn đề của tôi là bất cứ khi nào tôi nhấp vào lần thứ hai, tôi thậm chí không thể nhìn thấy nút chuyển đổi. Để rõ ràng - nhấp chuột đầu tiên chuyển đổi nút chuyển đổi, vì vậy tôi có thể thấy số mà nó giữ, nhấp chuột thứ hai trên nút chuyển đổi khác được bật lên để chuyển đổi, hiển thị số và sau đó tiếp tục hoặc đặt điểm +1 nếu số là tương tự, hoặc đảo ngược lại nếu chúng khác nhau.Cách đặt độ trễ trong chức năng Android onClick

Dưới đây là mã mà tôi sử dụng làm chức năng onClick, tôi đã suy nghĩ về việc đặt một số loại giấc ngủ hoặc chức năng trì hoãn ở đâu đó trong "if block" thứ hai - (if (klikniecia == 2)).

Bất kỳ trợ giúp nào về chủ đề này sẽ được đánh giá cao.

public void onClick(View view) { 
for (int i = 0; i < karta.length; i++){ 
    if (view == karta[i]){ 
     karta[i].setEnabled(false); 
     klikniecia++; 
     if (klikniecia == 1){ 
      kartaID[0]=i; 
      kartaWartosc[0]=listaKart.get(i); 

     } 
     if (klikniecia == 2){ 
      kartaID[1]=i; 
      kartaWartosc[1]=listaKart.get(i); 

      //i think, about setting a delay here, so i can see both of the cards, regardles if the're the same or not before reverting them. 

      if (czyPara()){ 
       karta[kartaID[0]].setEnabled(false); 
       karta[kartaID[1]].setEnabled(false); 
       klikniecia=0; 
      } 
      else{ 

       karta[kartaID[0]].setEnabled(true); 
       karta[kartaID[0]].toggle(); 
       karta[kartaID[1]].setEnabled(true); 
       karta[kartaID[1]].toggle(); 
       klikniecia=0; 

      } 
     } 

    } 

} 

}

+12

Tại sao người ta vẫn sử dụng tên không phải tiếng Anh trong mã của họ? Điều đó làm cho sự hiểu biết/đọc nó thực sự khó khăn cho những người không nói ngôn ngữ $. – ThiefMaster

+2

Nó dễ dàng hơn cho tôi để sử dụng tên đánh bóng của các biến trong mã, và khi tôi viết nó tôi không nghĩ về bất cứ ai khác nhìn vào nó ;-) Mặc dù trong tương lai các dự án phức tạp hơn tôi có thể xem xét sử dụng tiếng Anh :-) – Piotrgo

Trả lời

51

Thay vì ngủ trong onclick, bạn có thể đăng một thông báo bị trì hoãn đến một trình xử lý (có liên quan đến runnable) và cập nhật giao diện người dùng. Rõ ràng phù hợp này vào thiết kế của ứng dụng của bạn và làm cho nó hoạt động, nhưng ý tưởng cơ bản là thế này:

//Here's a runnable/handler combo 
private Runnable mMyRunnable = new Runnable() 
{ 
    @Override 
    public void run() 
    { 
     //Change state here 
    } 
}; 

Sau đó từ onClick bạn gửi một thư bị trì hoãn đến một handler, chỉ rõ rằng Runnable để được thực thi.

Handler myHandler = new Handler(); 
myHandler.postDelayed(mMyRunnable, 1000);//Message will be delivered in 1 second. 

Tùy thuộc vào mức độ phức tạp của trò chơi, điều này có thể không chính xác như bạn muốn, nhưng nó sẽ giúp bạn bắt đầu.

+0

Nếu tôi có quyền này, khái niệm là tôi nên bọc một phần của mã tôi muốn bị trì hoãn bên trong runnable, và sau đó tham khảo nó với một sự chậm trễ từ onclick. Điều này có vẻ là một ý tưởng hay. Tôi sẽ cố gắng này ngày hôm nay, nhưng tôi nghĩ rằng nó sẽ làm việc :-) – Piotrgo

+0

Cảm ơn bạn! Nó hoạt động như một say mê! :-) – Piotrgo

+0

Tuyệt vời! Tôi vui vì nó đã làm việc cho bạn. –

2

Bạn nên không bao giờ ngủ trong thread UI (theo mặc định tất cả các mã của bạn chạy trong thread UI) - nó sẽ chỉ làm cho giao diện người dùng đóng băng, không để cho một cái gì đó thay đổi hoặc kết thúc. Tôi không thể đề xuất nhiều hơn vì tôi không hiểu logic mã.

2

Làm không ngủ trong chuỗi giao diện người dùng. Bạn cần một chuỗi khác sẽ tìm kiếm thông báo "đánh thức và chờ" từ chuỗi giao diện người dùng của bạn. Sợi thứ hai sau đó có thể làm ẩn sau một cuộc gọi bình thường. Sau đó, bạn có thể giữ sợi xung quanh cho lần tiếp theo bạn cần che giấu thứ gì đó hoặc giết nó và roi lên một cái mới mỗi khi bạn cần một sự chậm trễ khác.

Tôi tin rằng có một số chức năng "postFoo" có thể hữu ích trong ngữ cảnh này (kích hoạt sự kiện giao diện người dùng từ bên ngoài chuỗi giao diện người dùng).

31

đúng việc:

final Handler handler = new Handler(); 
handler.postDelayed(new Runnable() { 
    @Override 
    public void run() { 
    //Do something after 100ms 
    } 
}, 100); 
1
b.setOnClickListener(new OnClickListener() { 

    public void onClick(View arg0) { 
     // TODO Auto-generated method stub 

     final ProgressDialog myPd_ring=ProgressDialog.show(MainActivity.this, "confident checker", "calculating please wait..", true); 
     myPd_ring.setCancelable(true); 
     new Thread(new Runnable() { 
       public void run() { 
        // TODO Auto-generated method stub 


        try 
        { 
          Thread.sleep(5000); 


        } 
        catch(Exception e){} 
        b.dismiss(); 
       } 
     }).start(); 


     final Handler handler = new Handler(); 
     handler.postDelayed(new Runnable() { 
      public void run() { 
       Toast.makeText(getApplicationContext(), "today your confident level is 90% ", 
         Toast.LENGTH_LONG).show(); 

      } 
     }, 5000); 


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