我有一个动画,我想通过点击按钮来加速和减速。 我看了很多,无法找到解决方案。目前我有一个用于按钮的actionlistener,用于更改延迟变量的值并重新启动计时器。
任何人都可以提供建议。 感谢
答案 0 :(得分:2)
而不是更改动画的其他部分可能依赖的计时器,我会更改对象的速度。
这不太主观。我的例子有一个能够在同一时间段内改变速度的物体。实际上,您可能需要更改动画播放的时间,这需要更改时间。这带来了其他问题。
实现这一目标的一种方法是,实际上有一个定时滴答的计时器和一个对这些滴答作出反应的模型。这意味着如果你调整持续时间,心跳不会受到影响,你只需要通过动画调整距离。这就是Timing Framework的工作原理,我相信Trident遵循类似的设计
public class TestAnimationSpeed {
public static void main(String[] args) {
new TestAnimationSpeed();
}
public TestAnimationSpeed() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setLayout(new BorderLayout());
frame.add(new AnimationPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class AnimationPane extends JPanel {
private JSlider slider;
private BouncyPane bouncyPane;
public AnimationPane() {
setLayout(new BorderLayout());
bouncyPane = new BouncyPane();
add(bouncyPane, BorderLayout.CENTER);
slider = new JSlider(1, 11);
slider.setMajorTickSpacing(2);
slider.setPaintTicks(true);
add(slider, BorderLayout.SOUTH);
slider.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
bouncyPane.setVerticalSpeed(slider.getValue());
}
});
slider.setValue(4);
}
}
public class BouncyPane extends JPanel {
private int dy = 4;
private Ellipse2D ball;
public BouncyPane() {
ball = new Ellipse2D.Float(100, 0, 10, 10);
Timer timer = new Timer(1000/60, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
double y = ball.getY();
y += dy;
if (y + ball.getHeight() > getHeight()) {
y = getHeight() - ball.getHeight();
dy *= -1;
} else if (y < 0) {
y = 0;
dy *= -1;
}
ball.setFrame(ball.getX(), y, ball.getWidth(), ball.getHeight());
repaint();
}
});
timer.setRepeats(true);
timer.setCoalesce(true);
timer.start();
}
public void setVerticalSpeed(int speed) {
if (dy < 0 && speed > 0) {
dy = -speed;
} else {
dy = speed;
}
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D) g.create();
g2d.setColor(Color.RED);
g2d.fill(ball);
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
}
}