public void onClick(View v) {
// TODO Auto-generated method stub
switch(v.getId()){
case R.id.rollDice:
Random ranNum = new Random();
int number = ranNum.nextInt(6) + 1;
diceNum.setText(""+number);
sum = sum + number;
for(i=0;i<8;i++){
for(j=0;j<8;j++){
int value =(Integer)buttons[i][j].getTag();
if(value==sum){
inew=i;
jnew=j;
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
//I want to insert a delay here
buttons[inew][jnew].setBackgroundColor(Color.WHITE);
break;
}
}
}
break;
}
}
Je veux définir un délai entre la commande entre changer de fond. J'ai essayé d'utiliser un minuteur de fil et essayé d'utiliser run et catch. Mais ça ne marche pas. J'ai essayé ça
Thread timer = new Thread() {
public void run(){
try {
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
sleep(5000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
};
timer.start();
buttons[inew][jnew].setBackgroundColor(Color.WHITE);
Mais cela ne fait que devenir noir.
Essayez ce code:
final Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
// Do something after 5s = 5000ms
buttons[inew][jnew].setBackgroundColor(Color.BLACK);
}
}, 5000);
Vous pouvez utiliser CountDownTimer
qui est beaucoup plus efficace que toute autre solution publiée. Vous pouvez également produire des notifications régulières sur les intervalles le long du chemin en utilisant sa méthode onTick(long)
Regardez cet exemple montrant un compte à rebours de 30 secondes
new CountDownTimer(30000, 1000) {
public void onFinish() {
// When timer is finished
// Execute your code here
}
public void onTick(long millisUntilFinished) {
// millisUntilFinished The amount of time until finished.
}
}.start();
Si vous utilisez souvent le délai dans votre application, utilisez cette classe d'utilitaires.
import Android.os.Handler;
public class Utils {
// Delay mechanism
public interface DelayCallback{
void afterDelay();
}
public static void delay(int secs, final DelayCallback delayCallback){
Handler handler = new Handler();
handler.postDelayed(new Runnable() {
@Override
public void run() {
delayCallback.afterDelay();
}
}, secs * 1000); // afterDelay will be executed after (secs*1000) milliseconds.
}
}
Usage:
// Call this method directly from Java file
int secs = 2; // Delay in seconds
Utils.delay(secs, new Utils.DelayCallback() {
@Override
public void afterDelay() {
// Do something after delay
}
});
Utilisation de la méthode Thread.sleep(millis
).
Si vous voulez faire quelque chose dans l'interface utilisateur à des intervalles de temps réguliers, une très bonne option consiste à utiliser CountDownTimer:
new CountDownTimer(30000, 1000) {
public void onTick(long millisUntilFinished) {
mTextField.setText("seconds remaining: " + millisUntilFinished / 1000);
}
public void onFinish() {
mTextField.setText("done!");
}
}.start();
vous pouvez utiliser ceci:
import Java.util.Timer;
et pour le retard lui-même ajouter:
new Timer().schedule(
new TimerTask(){
@Override
public void run(){
//if you need some code to run when the delay expires
}
}, delay);
La variable "delay" représente les millisecondes. Par exemple, définissez un délai de 5 000 à 5 secondes.
Handler répond à Kotlin:
1 - Créez une fonction de niveau supérieur dans un fichier (par exemple, un fichier contenant toutes vos fonctions de niveau supérieur):
fun delayFunction(function: ()-> Unit, delay: Long) {
Handler().postDelayed(function, delay)
}
2 - Puis appelez-le n'importe où vous en avez besoin:
delayFunction({ myDelayedFunction() }, 300)
Voici un exemple où je change l’image d’arrière-plan d’une image à l’autre avec un délai alpha de 2 secondes dans les deux sens - Fondu 2 secondes de l’image d’origine en fondu 2 secondes dans la deuxième image.
public void fadeImageFunction(View view) {
backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
backgroundImage.animate().alpha(0f).setDuration(2000);
// A new thread with a 2-second delay before changing the background image
new Timer().schedule(
new TimerTask(){
@Override
public void run(){
// you cannot touch the UI from another thread. This thread now calls a function on the main thread
changeBackgroundImage();
}
}, 2000);
}
// this function runs on the main ui thread
private void changeBackgroundImage(){
runOnUiThread(new Runnable() {
@Override
public void run() {
backgroundImage = (ImageView) findViewById(R.id.imageViewBackground);
backgroundImage.setImageResource(R.drawable.supes);
backgroundImage.animate().alpha(1f).setDuration(2000);
}
});
}