Aller au contenu

Afficher une image puis la remplacer par une autre qq secondes après


Stilgardt

Recommended Posts

Bonsoir,

Je bloque (encore) sur un problème et j'en appelle aux bonnes âmes qui trainent ici! :D

(j'ai espoir aussi de bientôt pouvoir aider à mon tour! :) )

Voici ce que j'essaie de faire:

Sur un clic de bouton, j'affiche une image puis, quelque secondes après, une autre image doit remplacer la première.

Voici en gros le code que j'ai fait:

View.OnClickListener my_listener = new OnClickListener() {

public void onClick(View view) {

ImageView my_image = (ImageView) findViewById(R.id.ImageView1);

double index = 0;

my_image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.image01));

for(index=0;index<99999;index++)

{

}

my_image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.image02));

}

Ca m'avait l'air assez compliqué d'utiliser await pour faire une boucle d'attente donc j'ai préféré faire à l'ancienne avec un bon "for(...)" ... :P

Ce qui se passe, c'est que j'ai image02 qui s'affiche mais je ne vois jamais image01.

Est-ce que l'affichage ne se réalise seulement une fois que l'on sort du OnClickListener ? :/

Lien vers le commentaire
Partager sur d’autres sites

Merci pour vos réponses rapides! :)

@Fluckysan: Je vois le mot thread depuis quelques semaines sans savoir de quoi il retourne (sauf que souvent, c'est accompagné d'une phrase du style "c'est compliqué!" :) ) donc je vais parcourir la doc Android pour voir ce qui se cache derrière ça exactement :D

@popolbx: Si je ne parviens pas à comprendre comment utiliser les threads, je me tournerai alors vers la solution "alarme" :D

Lien vers le commentaire
Partager sur d’autres sites

Whaa, une alarme, c'est un peu prendre un marteau pilon pour ouvrir un noix, non ?

Arretez moi si je me trompe :

Une alarme, c'est fait pour appeler ton programme à un temps donné, même si ton programme ne tourne plus à ce moment là ( c'est tres bien pour programmer un reveil par exemple ).

Pour ton cas, ou tu restes dans le meme programme, il est fortement conseillé d'utiliser quelque chose de plus light, comme les postDelayed.

en gros qq chose du genre :

Dans ton click image :

MyImage.PostDelayed( ChangeImage, 3000 ) ; // 3000 => 3 sec ?

Puis plus loin :

private Runnable ChangeImage = new Runnable()

{

public void run()

{

my_image.setImageDrawable(mContext.getResources().getDrawable(R.drawable.image02));

}

};

C'est à la louche, si ca pose des problemes, dis nous lesquels, mais je pense que c'est ca la bonne piste...

Emmanuel

Lien vers le commentaire
Partager sur d’autres sites

@Alocaly/Emmanuel: Merci! Ca marche impec ta solution! :) (juste besoin de la petite retouche suivant: mettre postDelayed au lieu de PostDelayed :D )

Ce n'est pas encore aujourd'hui que je me plongerai dans les threads...ni dans les alarmes :D

Merci à vous trois en tout cas!

Lien vers le commentaire
Partager sur d’autres sites

  • 9 months later...

Bonjour,

Je relance le sujet car je me heurte à un problème similaire.

Je développe ma première appli qui est un quizz de culture G dans laquelle je m'inspire un peu de l'interface de tout le monde veut prendre sa place.

En fait, quand l'utilisateur clique sur une réponse, je veux que le bouton sur lequel il a cliqué se mettre en bleu pendant 300ms par exemple, puis en fonction du cas, si c'est la bonne question, se mette en vert ou si c'est la mauvaise, se mettre en rouge et colore la bonne en vert pendant encore un certain laps de temps.

Disons que la bonne reponse est sur le bouton 1 mais que je clique sur le 2

Donc en gros mon code :

//code bouton dans onClick

si le bouton 2 est cliqué

je change le background du bouton en bleu

je thread.sleep

je change le background du bouton 1 en vert et celui du 2 en rouge

je thread.sleep le temps que l'utilisateur puisse voir

Mais ca ne fait pas ce que je veux, c'est comme si le dernier sleep ne servait à rien, j'ai a peine le temps de voir le changement de couleur vert/rouge.

En fait, je cherche juste a freezer l'interface pour que l'utilisateur ait le temps de voir la réponse. Parce que le "t'as faux mais tu sauras pas pourquoi", c'est mal.

J'ai aussi essayé le truc avec le PostDelayed mais sans succes.

Merci d'avance.

Bien cordialement,

Louis

Lien vers le commentaire
Partager sur d’autres sites

et après le dernier thread sleep, qu'est tu sensé faire ? Afficher une autre question ?

Car on sait pas ce que tu souhaites faire après. Exemple, si c'est une liste de question, rendre les objets non sélectionnables, ou encore si c'est passé à une autre question, le faire lors du retour du thread via handleMessage etc.

Lien vers le commentaire
Partager sur d’autres sites

Après le freeze qui change la couleur des bons et mauvais boutons, je finis mon activité. En fait, cette activité est appelée via startActForResult.

Donc en gros, après le dernier freeze, c'est soit setResult(RESULT_CANCELED) ou setResult(RESULT_OK) puis finish();. De cette façon, je reviens sur ma page où le score est affiché et où je peux cliquer pour commencer une nouvelle question.

Lien vers le commentaire
Partager sur d’autres sites

Le problème est que je n'utilise pas de thread, j'essaie de m'y pencher mais je galère un peu.

En gros voici le code tel qu'il était avant que je farfouille tout pour essayer de faire marcher le bouzin avec un thread qui ne marche pas.

Dans onClick :

switch (arg0.getId()) {

case R.id.b1:

// psser le bouton 1 en bleu

bRep1.setBackgroundResource(R.drawable.button3);

// ici j'aimerais bien freezer l'ui genre 500ms pour qu'on voit que c'est celle la qu'on a cliqué

// mais ça au pire c'est pas grave

// si bonne rep

if(blabal))

{

//passer bouton 1 en vert

bRep1.setBackgroundResource(R.drawable.button1);

setResult(RESULT_OK);

}

else // mauvaise reponse

{

// si la bonne reponse était le bouton 2

//y mettre la couleur verte

if(blabla))

{

bRep2.setBackgroundResource(R.drawable.button1);

}

// si la bonne reponse était le bouton 2

else if(balba))

{

bRep3.setBackgroundResource(R.drawable.button1);

}

// c'eétait donc le bouton 4

else bRep4.setBackgroundResource(R.drawable.button1);

//passer le bouton 1 en rouge

bRep1.setBackgroundResource(R.drawable.button2);

// Et la aussi, j'aimerais bien un temps de pause histoire que l'utilisateur puisse vior la bonne rep

setResult(RESULT_CANCELED);

}

finish();

break;

...

Lien vers le commentaire
Partager sur d’autres sites

J'avais mal lu ton post, donc voici l'activité appelante :

protected void onActivityResult(int requestCode, int resultCode, Intent data) {

// TODO Auto-generated method stub

super.onActivityResult(requestCode, resultCode, data);

switch (requestCode) {

case CODE_ACTIVITE:

switch (resultCode) {

case RESULT_OK:

score++;

// + modifier le texte de la TextView et celui du bouton

break;

case RESULT_CANCELED:

// owned, t'es redirigé vers la page ou tu peux submit ton score

...

Je veux que le changement de couleurs de boutons se fasse sur l'activité fille, pas dans la mère vu que la mère ne présente pas du tout la même interface.

Le code que j'ai donné dans le post précédent correspond à un bout de code de l'activité fifille.

Là, je me frotte aux handlers, aux runnable, au postDelayed mais sans vraiment de succès, à mon plus grand désespoir.

Lien vers le commentaire
Partager sur d’autres sites

  • 8 months later...

Bonjour à tous,

Je rencontre un problème similaire à celui de Stilgardt. Aussi j'ai bien suivi vos réponses et j'ai donc eu recours à la solution du Runnable.

Par contre, je voudrais maintenant boucler sur (ou dans) ce Runnable.

Je m'explique : je voudrais afficher plusieurs images les unes après les autres avec une petite temporisation (de quelques secondes voir moins) dans l'idée d'un diaporama rapide. L'idée est très proche si ce n'est qu'il me faut maintenant boucler.

La différence se trouve aussi dans le fait que je charge des images à partir de la SDcard mais je ne pense pas que ça pose plus de souci que ça pour le bouclage.

Mon code est le suivant :

public void onClick(View v) {

int cpt =0;

ImageView im = (ImageView)findViewById(R.id.imageView);

im.setImageURI(Uri.parse("/sdcard/images/"+cpt+".jpg"));

im.postDelayed(ChangeImage, 10);

}

private Runnable ChangeImage = new Runnable() {

public void run()

{

ImageView im = (ImageView)findViewById(R.id.imageView);

for (cpt=0; cpt<100; cpt++) {

im.setImageURI(Uri.parse("/sdcard/images/"+cpt+".jpg"));

try {

Thread.sleep(100);

} catch (InterruptedException e) {

e.getMessage();

}

}

}

};

Je ne pense pas être très loin de la solution mais, malheureusement, uniquement la première et la dernière image (0 et 99) s'affiche (même avec un sleep important).

Merci d'avance de votre aide !

Lien vers le commentaire
Partager sur d’autres sites

Rejoignez la conversation

Vous pouvez poster maintenant et vous enregistrez plus tard. Si vous avez un compte, connectez-vous maintenant pour poster.

Invité
Unfortunately, your content contains terms that we do not allow. Please edit your content to remove the highlighted words below.
Répondre à ce sujet…

×   Collé en tant que texte enrichi.   Coller en tant que texte brut à la place

  Seulement 75 émoticônes maximum sont autorisées.

×   Votre lien a été automatiquement intégré.   Afficher plutôt comme un lien

×   Votre contenu précédent a été rétabli.   Vider l’éditeur

×   Vous ne pouvez pas directement coller des images. Envoyez-les depuis votre ordinateur ou insérez-les depuis une URL.

×
×
  • Créer...