[Java] Animation de glissement ->Gfive au secours !!! :-)

Animation de glissement ->Gfive au secours !!! :-) [Java] - Java - Programmation

Marsh Posté le 27-04-2002 à 18:55:54    

Re,
 
Une autre question. Je cherche un mécanisme pour faire défiler de l'information textuelle. Exemple, j'ai 3 lignes de texte (la premiere fait référence au point précédent, la 2 fait référence au point actuel, la 3eme au point suivant. Lorsque on change de "point", les lignes défiles (la 1ere disparait, la 2eme et 3eme remonte en 1 et 2 respectivement et une nouvelle apparit comme "point suivant).
 
J'ai pas trop envie de réinvinter la roue -> open source?
 
Genre l'applet qu'il y a sur http://java.sun.com (success stories, etc.)
 
Merchi  :hello:

 

[jfdsdjhfuetppo]--Message édité par DarkLord le 28-04-2002 à 15:29:54--[/jfdsdjhfuetppo]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 27-04-2002 à 18:55:54   

Reply

Marsh Posté le 28-04-2002 à 15:15:03    

up
 
et pour java.sun.com c'est les User group local (en bas à gauche) C'est exacteement le genre de truc que j'aimerai avoir

 

[jfdsdjhfuetppo]--Message édité par DarkLord le 28-04-2002 à 15:15:25--[/jfdsdjhfuetppo]


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 28-04-2002 à 16:08:42    

Désolé, j'ai lu, cherché, observé ton problème mais je n'en connais pas (encore) la réponse.


---------------
Le site de ma maman
Reply

Marsh Posté le 28-04-2002 à 16:12:18    

Cherrytree a écrit a écrit :

Désolé, j'ai lu, cherché, observé ton problème mais je n'en connais pas (encore) la réponse.  




 
est ce que c'est compréhensible ou est ce que je dois donner plus de détails?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 28-04-2002 à 16:33:06    

Le truc User group local, c'est bien la liste des pays qui défile de haut en bas, du côté gauche de la page de démarrage du site de Sun, non ?


---------------
Le site de ma maman
Reply

Marsh Posté le 28-04-2002 à 17:51:18    

Bah, j'ai pas tout compris à ce que tu veux faire :D Tu m'expliques mieux??
 
Bon, déjà, j'ai un truc qui peut t'intéresser, qui fait scroller du texte dans un label...il serait pas bien difficile de le modifier pour faire scroller sur plusieurs lignes verticalement. Mais si tu n'as pas besoin que ça scrolle, juste que ça change, t'as vraiment pas besoin de te faire chier avec ça..

Reply

Marsh Posté le 28-04-2002 à 17:54:29    

Ah, j'ai vu, les users groups, là..Effectivement, c'est pas bien compliqué! :D
Mais là, je suis chez moi, donc, j'ai qu'un pauv'modem!  
Je vais essayer de modifier ma classe pour te faire un truc approchant, et je t'envoies ça demain, si j'oublie pas! :D

Reply

Marsh Posté le 28-04-2002 à 21:42:01    

gfive a écrit a écrit :

Ah, j'ai vu, les users groups, là..Effectivement, c'est pas bien compliqué! :D
Mais là, je suis chez moi, donc, j'ai qu'un pauv'modem!  
Je vais essayer de modifier ma classe pour te faire un truc approchant, et je t'envoies ça demain, si j'oublie pas! :D  




 
je n'en demande pas tant !!!! ;)
 
merciiiiiiiiiiiiiiiii  :hello:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 28-04-2002 à 21:42:13    

Cherrytree a écrit a écrit :

Le truc User group local, c'est bien la liste des pays qui défile de haut en bas, du côté gauche de la page de démarrage du site de Sun, non ?  




 
yes!


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 28-04-2002 à 23:11:38    

moi aussi j aimerai bine aprendre a le faire ce truc
 
 
jme souvien ds mon ancienne boite (une start up qui a depuis fait faillite) il m avait acheter une decompilateur expres (decafé pro ) pour que je puisse modifié une applet du meme style (je sait c 'est illegal mais j'obeissait aux ordres)  
 
voila  :sol:

Reply

Marsh Posté le 28-04-2002 à 23:11:38   

Reply

Marsh Posté le 28-04-2002 à 23:23:02    

Arg, j'ai pas pu m'occuper de ça ce soir, mais je t'enverrais déjà le code du scroll horizontal demain.
 
Pour le scroll vertical, c'est un peu plus compliqué, mais vraiment, y'a rien de sorcier....
 
Juste histoire de te donner une idée, il faut faire une sous-classe de Canvas, qui va gérer l'affichage.
 
Pour le double-buffering qui évite le clignotement, le principe sera exactement le même que pour le scroll horizontal : en gros, tu dessines sur une image non affichée, genre comme ça :
 
public void paint(Graphics g) {
      clear(g);
      update(g);
    }
 
    public void update(Graphics g) {
      setLocation(0, 0);
      paintOffScreen();
      clear(g);
      getGraphics().drawImage(offScreenImage, 0, 0, this);
    }
 
    private void paintOffScreen() {
      if (offScreenImage == null) {
 offScreenImage = createImage(getSize().width, getSize().height);
      }
      Graphics g = offScreenImage.getGraphics();
       ....Tu dessines ici...En l'occurence, il faut récupérer l'objet FontMetrics référant à la fonte à utliiser pour calculer les positions des chaînes à déssiner.
     }
 
 
Ensuite, avec ce genre de scrolling, la difficulté vient de l'animation : il faut que t'aies une thread pour gérer ça : a chaque tour de boucle (tu met la temporisation que tu veux, après), il faut changer une valeur, qui servira à calculer la position de base et la première ligne à afficher...
 
Après, d'un point de vue pratique, dans ce genre de trucs, je code 2 classes : une qui gère le graphique, qui est une sous-classe e Canvas, et une qui gère les à c^otés (données, animation, etc) qui est une sous-classe de Panel, pour pouvoir facilement l'utiliser dans les interfaces...

Reply

Marsh Posté le 29-04-2002 à 01:04:35    

Waouh : Avec double buffering et ben ! Tu posteras le code complet, où vous règlerez ça en private ?


---------------
Le site de ma maman
Reply

Marsh Posté le 29-04-2002 à 07:51:39    

/me est impressioné !!!  :ouch:


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 29-04-2002 à 09:38:52    

Alors alors :
 
La classe ScrollingLabel (exemple d'animation...)
 
import java.awt.*;
 
public class ScrollingLabel extends Panel implements Runnable {
 
    private static final int TIMER = 20;
    public static final int LEFT = 0;
    public static final int RIGHT = 1;
 
    private String text;
 
    private Thread scroller;
 
    private volatile boolean alive = false;
 
    private int way;
 
    private int length;
   
    private Scrolling label;
 
    private int offset = -1;
 
    private int gap = 3;
 
    private int timeout = TIMER;
 
    private boolean init = false;
 
    public ScrollingLabel() {
 super(new FlowLayout());
 add(new Scrolling(this));
 this.way = RIGHT;
    }
 
 
    public ScrollingLabel(String text) {
 super();
 label = new Scrolling(this);
 add(label);
 setText(text);
 this.way = RIGHT;
    }
 
    public boolean isScrolling() {
 return alive;
    }
 
    public void start() {
 scroller = new Thread(this);
 alive = true;
 scroller.start();
    }
   
    public void stop() {
 alive = false;
 scroller = null;
    }
 
    public void setSize(int width, int height) {
 super.setSize(width, height);
 label.setSize(width, height);
    }
 
    public void setSize(Dimension d) {
 setSize(d.width, d.height);
    }
 
 
    public int getOffset() {
 return offset;
    }
 
    public void setText(String text) {
 this.text = text;
    }
 
    public String getText() {
 return text;
    }
         
    public void invertWay() {
 if (way == RIGHT) {
     way = LEFT;
 } else {
     way = RIGHT;
 }
    }
 
    public void faster() {
 timeout = timeout / 2;
    }
 
    public void slower() {
 timeout = timeout * 2;
    }
   
    public void changeText(String text) {
 init = false;
 setText(text);
 init(getGraphics());
    }
 
    public void run() {
 while (alive) {
     if (way == RIGHT) {
  offset++;
  if (offset == Math.max(length, getSize().width)) {
      offset = 0;
  }
     } else {
  offset--;
  if (offset == 0) {
      offset = Math.max(length, getSize().width);
  }
     }
     label.update(getGraphics());
     try {
  Thread.sleep(timeout);
     } catch (Exception e) {
  e.printStackTrace(System.out);
     }
 }  
    }
 
   
    public void init(Graphics g) {
 if (!init) {
     FontMetrics fm = g.getFontMetrics();
     length = fm.stringWidth(getText());
     if (length > getSize().width) {
  setText(getText() + " - " );
  length = fm.stringWidth(getText());
  offset = getSize().width / 2;
     } else {
  offset = (getSize().width - length) / 2;
     }
     try {
  label.update(g);
     } catch (Exception e) {
     }
 }
 init = true;
    }
 
    public void paint(Graphics g) {
 g.setFont(getFont());
 FontMetrics fm = g.getFontMetrics();
 init(g);
 setSize(getSize().width, fm.getHeight() + (2 * gap));
    }
 
 
 
    public class Scrolling extends Canvas {
 
 public ScrollingLabel parent;
     
 public Image offScreenImage;
 
 public Scrolling(ScrollingLabel parent) {
     super();
     this.parent = parent;
 }
 
 private void clear(Graphics g) {
     g.setColor(parent.getBackground());
     g.fillRect(0, 0, getSize().width, getSize().height);
 }
     
 public void paint(Graphics g) {
     offScreenImage = createImage(getSize().width, getSize().height);
     clear(g);
     update(g);
 }
 
 public void update(Graphics g) {
     setLocation(0, 0);
     paintOffScreen();
     clear(g);
     getGraphics().drawImage(offScreenImage, 0, 0, this);
 }
 
 private void paintOffScreen() {
     if (offScreenImage == null) {
  offScreenImage = createImage(getSize().width, getSize().height);
     }
     Graphics g = offScreenImage.getGraphics();
     g.setFont(parent.getFont());
     FontMetrics fm = g.getFontMetrics();
     clear(g);
     int offset = parent.getOffset();
 
     g.setColor(parent.getForeground());
     if (fm.stringWidth(parent.getText()) > getWidth()) {
  //The text is larger than th total width of the label
  // We add a separator..
  //This draws the beginning of the text...at the end of the label (pos offset -> end of label)
  if (offset < getSize().width) {
      g.drawString(parent.getText(), offset, parent.gap + fm.getAscent());
  }
  //We need to fill some space with the end of the text....
  g.drawString(parent.getText(), offset - fm.stringWidth(parent.getText()), parent.gap + fm.getAscent());
     } else {  
  // There is enough place to put the whole text....But we may have to cut it.
  if ((offset + fm.stringWidth(parent.getText())) < getWidth()) {
      // The text can be drawned whithout cutting it.
      g.drawString(parent.getText(), offset, parent.gap + fm.getAscent());
  } else {
      g.drawString(parent.getText(), offset, parent.gap + fm.getAscent());
      g.drawString(parent.getText(), offset - getSize().width, parent.gap + fm.getAscent());
  }
     }
 }
    }
 
}
 
Bon, elle est pas parfaite : j'ai l'impression que l'animation accélère quand on change de sens, je sais pas pourquoi!!  
 
Et une classe de test, avec des boutons et tout pour voir le truc fonctionner :  
 
import java.awt.*;
import java.awt.event.*;
 
 
public class Test extends Panel implements ActionListener {
    public ScrollingLabel label;
    public Button b1;
    public Button b2;
    public Button b3;
    public TextField f;
     
    public Test(String text) {
 super(new BorderLayout(5, 5));
 b1 = new Button("Start" );
 b2 = new Button("Change Text" );
 b3 = new Button("Change Way" );
 label = new ScrollingLabel(text);
 f = new TextField(20);
 
 b1.addActionListener(this);
 b2.addActionListener(this);
 b3.addActionListener(this);
 
 Panel p = new Panel(new FlowLayout());
 p.add(b2);
 p.add(f);
 
 Panel p2 = new Panel(new FlowLayout());
 p2.add(b1);
 p2.add(b3);
 
 add(label, BorderLayout.NORTH);
 add(p2, BorderLayout.CENTER);
 add(p, BorderLayout.SOUTH);
    }
     
    public void actionPerformed(ActionEvent e) {
 if (e.getSource() == b1) {
     if (label.isScrolling()) {
  label.stop();
  b1.setLabel("Start" );
     } else {
  label.start();
  b1.setLabel("stop" );
     }
 }  
 
 if ((e.getSource() == b2) && (f.getText().length() != 0)) {
     label.stop();
     label.setText(f.getText());
     label.start();
 }
 
 if (e.getSource() == b3) {
     label.stop();
     label.invertWay();
     label.start();
 }
    }
     
    public static void main(String args[]) {
 
 StringBuffer sb = new StringBuffer();
 for (int i = 0; i < args.length; i++) {
     sb.append(args[i]).append(" " );
 }
 
 Frame f = new Frame("Test" );
 f.add(new Test(sb.toString()));
 f.pack();
 f.show();
    }
}
 
N'hésitez pas à poser des questions si vous pigez pas comment ça marche.

Reply

Marsh Posté le 29-04-2002 à 09:49:16    

bin en fait ce que je voulais c'est un scrolling vertical :(
Mais merci c'est super je vais regarder comment faire pour changer ca ...
 
A+ et encore merci
 
PS : tu me files tes coordonnées et ton nom en privé pour que je mette le tag @author proprement?


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 29-04-2002 à 10:10:06    

Bah, je sais, que tu voulais vertical, mais j'ai pas eu le temps de le coder hier soir....
Vu que j'ai rien à faire ce soir, et qu'i ly a rien à la télé, j'essaierai de voir si je peux pondre qqchose : c plutôt marrant à faire.
 
Bon, sinon, le principe d'animation est exactement le même...Le problème, ça va être de calculer les lignes à afficher, et leur position, parce qu'il y a deux notions qui se chevauchent un peu : on veut scrolller de façon fluide, mais on veut pouvoir déterminer qu'on a une ligne complète affichée ou pas.....  
 
Mais tu veux que ce soit cyclique, ou pas? (c'est à dire, tu veux que si le nombre de lignes à afficher n'augmente pas indéfiniement, on revienne à la première) Et tu veux une pause au moment où une nouvelle ligne est affichée?
Et tu veux des liens cliquables, dedans??

Reply

Marsh Posté le 29-04-2002 à 10:17:39    

gfive a écrit a écrit :

Mais tu veux que ce soit cyclique, ou pas? (c'est à dire, tu veux que si le nombre de lignes à afficher n'augmente pas indéfiniement, on revienne à la première) Et tu veux une pause au moment où une nouvelle ligne est affichée?
Et tu veux des liens cliquables, dedans??  




 
Je m'explique mieux. C'est pour utiliser dans une solution e-learning. En gros, l'applet rejoue un cours avec l'audio du prof en synchronisation.
 
Au début j'avais simplement une liste HTML avec les slides et invoquant une méthode Java depuis Javscript j'arrivais à demander à l'applet de changer de slide. Seulement c'est pas super propre (et ca ne marche pas avec netscape car il ne sait pas communiquer avec le JRE).
 
Bref, en gros suppose que tu as un cours avec 7 slides:
 
Introduction
Agenda
Point1
Point2
Point3
Conclusion
Liens
 
Un objet slide a un nom (name) et une url (url). Ce que je voudrais c'est que dans l'applet il y ait une liste avec 3 slides en permanence sur trois lignes
 
Ligne 1 le slide précédent
Ligne 2 le slide actuel (avec une couleur différente)
Ligne 3 le slide suivant
 
+ un boutton en haut pour remonter dans le liste des slides et eventuellement en sélectionner un (getUrl et jump à ce slide là)
+ un boutton en bas pour descendre dans la liste des slides
 
Au début tu as un truc du genre
 
Ligne 1 : vide
Ligne 2 : Introduction (en rouge par exemple)
Ligne 3 : Agenda
 
L'utilsateur appuie sur play, l'audio démarre et le slide introduction est affiché bla bla bla bla. Arrive un moment où on arrive sur le slide Agenda. A ce moment là j'invoquerai une méthode publique du composant qui a pour but de faire défiler de manière jolie les slides et on se retrouverait avec
 
Ligne 1 : Introduction
Ligne 2 : Agenda
Ligne 3 : Point 1
 
etc etc jusqu'à la fin de la session
 
Ligne 1 : Conclusion
Ligne 2 : Liens
Ligne 3 : vide
 
Est ce plus clair comme ca?
 
 :hello:  
 
PS : je te demande absolument pas de le faire. Je dois aussi travailler moi même. Si tu es intéressé par le projet tu peux me rejoindre, toutes les bonnes volontés sont les bienvenus
 
(http://sourceforge.net/projects/webreplay)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 29-04-2002 à 10:34:53    

Ah ouais, du coup, c'est moins compliqué, là!! :D
 
Bah, en gros, tu as besoin d'un composant avec une méthode qui fait scroller d'un cran en avant ou en arrière....Et si possible, qui permette de sélectionner un élément....J'ai déjà fait une Table comparable à la JTable, avec une scrollbar et tout....En partant de là, ce serait pas très compliqué d'obtenir ce que tu veux...
 
Je regarde ce qu'il y a moyen de faire avec ça, et je te dis!
 
PPS : je sais que tu me demandes pas de le faire, mais j'adore faire ce genre de trucs! :D

 

[jfdsdjhfuetppo]--Message édité par gfive le 29-04-2002 à 10:38:52--[/jfdsdjhfuetppo]

Reply

Marsh Posté le 29-04-2002 à 14:19:05    

cool ;)
 
Dis j'ai encore une question. Suppose que l'applet fasse 800 * 75 (largeur, hauteur). Est il possible de mettre une image en fond (si j'ai une image 800 * 75, est il possible de l'avoir en backgrouund, un peu comme une skin (winamp etc))
 
merchi ;)


---------------
Just because you feel good does not make you right
Reply

Marsh Posté le 29-04-2002 à 17:03:37    

Houlà.....Ben, ça dépend...Si tu as un seul composant à afficher dans ton applet, genre celui qui fait défiler le texte, aucun problème...Il suffit de mettre l'image en background...Par contre, si tu as des boutons, des trucs et des machins, c'est moins évident....Bon, ça peut se faire, hein, mais il faut découper l'image en morceaux que tu colleras sur ou autour des composants, etc...
 
J'ai créé des composants pour ça, (une bordure faite avec des images, nottament, et aussi des labels ou des bouton qui affichent des images..Mais c un peu galère à mettre en place après..

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed