2016-06-16 10 views
0

Ich versuche, einen Flip-Effekt mit Java-Swing zu machen, aber meine Flip-Methode sieht nicht wie ein echter Flip.In meiner Methode ändere ich die Breite mit der x var und der xspeed, wodurch das Bild kleiner und dann prüfen, ob das x> = als die Hälfte meines Bildes ist. hoffe jemand könnte mir helfen, es im voraus zu verbessern.Java Swing Animation

Animation-Klasse

public class Animation extends JPanel implements MouseListener { 

private static final long serialVersionUID = 3264508834913061718L; 

public Timer timer; 
public int x = 0; 
public int xspeed = 2; 
public boolean turning = true; 
public String pic = "/images/image.jpg"; 
public URL url = this.getClass().getResource(pic); 
public ImageIcon im = new ImageIcon(url); 
public String rev = "/images/image2.jpg"; 
public URL url2 = this.getClass().getResource(rev); 
public ImageIcon reverse = new ImageIcon(url2); 

public Animation(){ 
    this.setPreferredSize(new Dimension(128,128)); 
    this.setBackground(Color.BLACK); 
    this.setFocusable(true); 
    this.addMouseListener(this); 

} 

public void paintComponent(Graphics g){ 
    super.paintComponent(g); 

    g.drawImage(im.getImage(), 0 , 0, im.getIconWidth() - x, im.getIconHeight(), null); 
} 

public void flipAnimation(){ 
    ActionListener actionListener = new ActionListener() { 

     @Override 
     public void actionPerformed(ActionEvent e) { 
      // TODO Auto-generated method stub 
      // 
      if (turning) { 
       x = x + xspeed; 
      } 

      repaint(); 
      // x in the middle paint new image & set turning to false to stop animation 
      if(x >= im.getIconWidth()/2){ 
       turning = false; 
       x = 0; 
       im = reverse; 
      } 
     } 
    }; 
    if (turning) { 
     if (timer != null)timer.stop(); 

     timer = new Timer(30, actionListener); 
     timer.start(); 
    } 
} 


@Override 
public void mouseClicked(MouseEvent e) { 
    // TODO Auto-generated method stub 
    e.getSource(); 
    flipAnimation(); 
} 
+0

Also, was ist, wie es aussieht, ist unbefriedigend? Fehlt es an Frames? Wenn Sie möchten, dass es 3D aussieht, werden Sie das nicht mit Swing bekommen. – Frecklefoot

+0

Es sieht eher so aus, als ob das Bild sich nach links bewegt als ein Spiegelbild. ich möchte, dass es mehr wie sein Beschneiden von links und rechts ist @Frecklefoot – Aestraelyse

+0

Sie müssen auch Ihre 'x' Zeichnungsposition um' x' anpassen. Dann sieht es nicht so aus, als ob es gleitet. – Frecklefoot

Antwort

3

Erstens, ich bin zu raten Sie Ihr Bild wollen von beiden Seiten zu „falten“, so dass Sie das Bild des linken Rand zusammen mit seinem rechten Rand erhöhen werden wollen:

g.drawImage(im.getImage(), x/2 , 0, im.getIconWidth() - x, im.getIconHeight(), this); 

Beachten Sie die erste int Argument wurde 0-x/2 geändert. Außerdem ist es empfehlenswert, this als ImageObserver-Argument beim Zeichnen von Bildern in einer paintComponent-Methode zu übergeben, da die Komponente selbst das Objekt ist, das sich selbst neu streichen möchte, wenn das Bild im Hintergrund geladen wurde.

Zweitens ändern diese:

if (turning) { 
    x = x + xspeed; 
} 

dazu:

x = x + xspeed; 

Sie brauchen nicht eine Fahne, um die Animation zu steuern. (Der richtige Weg, um die Animation zu stoppen, ist timer.stop() aufzurufen, die ich in einem Moment bekommen.)

Drittens dies ändern:

if(x >= im.getIconWidth()/2){ 
    turning = false; 
    x = 0; 

dazu:

if(x >= im.getIconWidth()){ 
    xspeed = -xspeed; 
  • Wie ich schon sagte, das turning Flag wird nicht benötigt.
  • Der Grund für x der Breite des Bildes, statt die Hälfte der Breite zu vergleichen, ist, dass wir ändern wollen, hat sich das Bild nur dann, wenn das erste Bild vollständig „in gefaltet.“
  • Die Negation xspeed kehrt die Animation .

Schließlich, am Ende Ihrer Methode actionPerformed, möchten Sie diese hinzufügen:

if (x <= 0) { 
    timer.stop(); 
} 

Dies hält die Animation, wenn das Umkehrbild seine volle Größe erreicht, weshalb die turning Flagge wird nicht benötigt.