IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Android Discussion :

probleme d'affichage / forcer mise à jour graphique ?


Sujet :

Android

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut probleme d'affichage / forcer mise à jour graphique ?


    J'ai un souci d'affichage de mon textView. Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    package pi12.vr.myapplication;
     
    import android.graphics.Bitmap;
    import android.support.v7.app.AppCompatActivity;
    import android.os.Bundle;
    import android.util.Log;
    import android.view.View;
    import android.widget.EditText;
    import android.widget.ImageView;
    import android.widget.TextView;
     
    import org.opencv.android.OpenCVLoader;
    import org.opencv.android.Utils;
    import org.opencv.core.Mat;
    import org.opencv.imgcodecs.Imgcodecs;
    import org.opencv.imgproc.Imgproc;
     
    import java.io.IOException;
     
    import static org.opencv.imgcodecs.Imgcodecs.imwrite;
     
    public class MainActivity extends AppCompatActivity {
    	ImageView iv;
    	EditText et1;
    	EditText et2;
    	TextView tv;
     
    	@Override
    	protected void onCreate(Bundle savedInstanceState) {
    		super.onCreate(savedInstanceState);
    		setContentView(R.layout.activity_main);
    		iv = (ImageView) findViewById(R.id.imgv_image);
    		et1 = (EditText) findViewById(R.id.threshold1);
    		et2 = (EditText) findViewById(R.id.threshold2);
    		tv = (TextView) findViewById(R.id.txtv_charg);
     
    		if (!OpenCVLoader.initDebug()) {
    			Log.e(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), not working.");
    		} else {
    			Log.d(this.getClass().getSimpleName(), "  OpenCVLoader.initDebug(), working.");
    		}
     
     
    	}
     
    	public void displayImg(View view){
    		try {
    			tv.setText("Travail en cours ...");
    			while(!tv.getText().toString().equals("Travail en cours ..."));
    			Mat image = Utils.loadResource(getApplicationContext(),R.drawable.img_1);
    			Mat image2 = new Mat();
    			Imgproc.bilateralFilter(image, image2, 50, Double.valueOf(et1.getText().toString()), Double.valueOf(et2.getText().toString()));
    			Bitmap bitmap = Bitmap.createBitmap(image2.cols(),image2.rows(),Bitmap.Config.ARGB_8888);
    			Utils.matToBitmap(image2, bitmap);
    			iv.setImageBitmap(bitmap);
    			tv.setText("image affichée");
    		} catch (IOException e) {
    			e.printStackTrace();
    		}
    	}
    }
    La fonction displayImg est lancée lors de l'appui sur un bouton.

    Le texte "travail en cours ..." ne s'affiche jamais, alors que le texte "image affichée" oui.

    Je pense que le souci vient de la pompe à événements. Je m'explique, je pense que la ligne Imgproc.bilateralFilter(...) utilise le processeur à fond et que pendant ce temps la pompe ne met pas à jour l'interface graphique. Puis lorsque le traitement est fini la pompe à événements reprends la main et l'affiche pendant une fraction de seconde avant de le remplacer par "image affichée" (voir ne l'affiche pas du tout car sait qu'il faut déjà le remplacer).

    D'où mes questions :
    1) est-ce bien cela qui empêche l'affichage ?
    2) a) Si oui, comment je force la mise à jour de l'affichage avant l’exécution de la ligne problématique ?
    2) b) Si non, Qu'es-ce qui empêche l'affichage du texte ?

  2. #2
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    C'est surtout que l'évenement de "refresh" nécessaire à la mise à jour du TextView n'est executé qu'après celui qui appelle "displayImg".
    Du coup, il est fait à la sortie de displayImg... quand le contenu est à "image affichée"

    Je sais pas si il y a ici des cours de programmation événementielle, mais en gros c'est comme cela qu'on gère:

    evenement 1 (click ?): déclenche displayImg
    setText("Image en cours...") (=> empilage d'un "refresh")
    displayImg va lancer un "thread" de calcul qui à la fin va déclencher un évenement "fin de tâche"

    evenement refresh:
    affichage de "Image en cours..." dans le textview

    ....

    evenement "fin de tâche"
    affichage de l'image calculée
    setText("Image chargée") (=> empilage d'un "refresh")

    evenement refresh:
    affichage de "Image chargée" dans le textview



    Pour se simplifier la vie dans cette gestion, il y a la classe AsyncTask ...
    Elle propose même des évenements intermédiaires pour le début de tache (setText("Image en cours...")) la fin de tache (setImage / setText("Image chargée")), et au milieu (une barre de progression ?)

  3. #3
    Membre chevronné Avatar de Drowan
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2014
    Messages
    460
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 30
    Localisation : France, Isère (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2014
    Messages : 460
    Par défaut
    Merci pour ta réponse, c'est super clair et c'est exactement ce que je cherchais.


    Par curiosité, peut-on forcer l'évènement refresh ?

  4. #4
    Expert confirmé

    Homme Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    4 253
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2007
    Messages : 4 253
    Billets dans le blog
    3
    Par défaut
    On peut forcer son émission avec la fonction invalidate()

    On ne peut pas forcer un rafraîchissement immédiat par contre (le draw nécessite un tas de truc à faire en amont).

    D'ailleurs rien ne dit que le draw va effectivement afficher un truc à l'écran, si ça se trouve le draw "empile" les instructions dans un script, qui sera executé par le proc graphique à la fin (plus de puissance disponible graphiquement parlant, et surtout, pas besoin de repasser dans le onDraw des views si la fenêtre est rappelée à l'écran, ou redevient partiellement visible, ou que sais-je).

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [Graphique]Problème Mise à jour graphique
    Par ThieBEN dans le forum IHM
    Réponses: 13
    Dernier message: 05/04/2007, 16h52
  2. Probleme sur requete de mise à jour
    Par kikilevrai dans le forum Requêtes et SQL.
    Réponses: 2
    Dernier message: 08/01/2007, 11h54
  3. [JTable] Probleme pour afficher la mise à jour du modèle
    Par Yannick_from_31 dans le forum Composants
    Réponses: 2
    Dernier message: 02/06/2006, 19h10
  4. forcer mise à jour combo box
    Par Rcanada dans le forum Access
    Réponses: 3
    Dernier message: 07/04/2006, 10h54
  5. probleme de requete de mise à jour
    Par donny dans le forum PostgreSQL
    Réponses: 10
    Dernier message: 21/06/2005, 17h06

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo