ボタンをクリックするだけで速度を上げたり下げたりしたいアニメーションがあります。私はかなり周りを見回しましたが、解決策を見つけることができません。現在、遅延変数の値を変更してタイマーを再起動するボタンのアクションリスナーがあります。
誰かアドバイスしてもらえますか?ありがとう
ボタンをクリックするだけで速度を上げたり下げたりしたいアニメーションがあります。私はかなり周りを見回しましたが、解決策を見つけることができません。現在、遅延変数の値を変更してタイマーを再起動するボタンのアクションリスナーがあります。
誰かアドバイスしてもらえますか?ありがとう
次に、アニメーションの他の部分が依存する可能性のあるタイマーを変更するのではなく、オブジェクトの速度を変更します。
これは少し主観的です。私の例には、同じ時間で速度を変更できるオブジェクトがあります。実際には、代わりにアニメーションの再生時間を変更する必要がある場合があります。これには、時間の変更が必要になります。これは他の問題を引き起こします。
これを実現する1つの方法は、定期的にティックするタイマーと、それらのティックに反応するモデルを実際に用意することです。つまり、持続時間を調整しても心拍数は影響を受けず、アニメーション全体の距離を調整するだけで済みます。これがタイミングフレームワークの仕組みであり、トライデントも同様の設計に従っていると思います
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);
}
}
}