2016-06-16 7 views
0

자바 스윙에서 플립 효과를 만들려고하는데 플립 방식이 실제 플립처럼 보이지 않습니다. 제 방법으로는 x var 및 xspeed로 너비를 변경하여 이미지를 만듭니다. 더 작 으면 x가 내 이미지의 절반 이상인지 확인하십시오. 누군가가 사전에 덕분에 그것을 개선하는 데 도움이되기를 바랍니다.자바 스윙 애니메이션

애니메이션 클래스

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

그럼 어떻게 보이는지는 불만족 스럽습니까? 프레임이 누락 되었습니까? 3D로 보길 원한다면 Swing으로 그걸 얻지 못할 것입니다. – Frecklefoot

+0

이미지가 플립보다 왼쪽으로 움직이는 것처럼 보입니다. 왼쪽에서 오른쪽 자르기와 같은 것이 더 좋을 것 @Frecklefoot – Aestraelyse

+0

'x' 드로잉 위치를'x'로 조정해야합니다. 그러면 미끄러 져 보이지 않습니다. – Frecklefoot

답변

3

첫째, 난 당신이 오른쪽 가장자리를 따라 이미지의 왼쪽 가장자리를 증가 할 수 있습니다 귀하의 이미지가 양쪽에서 "에서 배"할 같은데요 :

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

첫 번째 int 인수가 0에서 x/2으로 변경되었습니다. 또한, 컴퍼넌트 자체는, 이미지의 백그라운드에서의로드가 완료했을 때에 그 자체를 재 묘화하는 객체이기 (위해) 때문에, paintComponent 메소드로 이미지를 묘화 할 때, ImageObserver 인수로서 this를 건네주는 것도 좋은 습관입니다.

둘째,이 변경이에

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

을 :

x = x + xspeed; 

당신은 애니메이션을 제어하는 ​​플래그가 필요하지 않습니다. (애니메이션을 중지하는 올바른 방법은 잠시 후에 얻을 수 있습니다 timer.stop()를 호출하는 것입니다.)

셋째,이 변경이에

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

:

if(x >= im.getIconWidth()){ 
    xspeed = -xspeed; 
  • 앞에서 말한 것처럼 turning 플래그는 필요하지 않습니다.
  • 대신 폭의 절반으로, 이미지의 폭 x을 비교하는 이유는, 우리가 첫 번째 이미지가 완전히 경우에만 이미지를 변경하려는 것입니다 "에 접혀."
  • xspeed의 부정은 애니메이션을 반전 .

마지막으로, 당신의 actionPerformed 메소드의 끝에서, 당신은이를 추가 할 수 있습니다 :

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

이 애니메이션을 중단 반대 이미지가 왜 turning 플래그입니다 전체 크기에 도달 할 때 필요하지 않습니다.