У меня есть изображение gif, отображаемое на JPanel в бесконечном цикле. Теперь мне нужно остановить анимацию после случайного количества кадров. Фактически, я генерирую случайное число, которое может быть 0 или 1. Скажем, что gif состоит из 6 кадров. Если число равно 0, я хочу остановиться на 3-м кадре, если он равен 1, анимация должна зависнуть на 6-м кадре.синхронизировать качающийся таймер с gif Изображение
Чтобы реализовать это, я попытался использовать таймер Swing, который запускает события точно, когда приходит следующий кадр. Таким образом, если кадры имеют задержку в 50 мс, я построить таймер, как
new Timer(50, this);
К сожалению, это не похоже на работу, на самом деле анимация, кажется медленнее, чем таймер. (Я предполагаю, что это имеет какое-то отношение к загрузке Times). Во всяком случае, я добавил код, иллюстрирующий подход «Проблема и (неудача) решения».
import java.awt.event.*;
import javax.swing.*;
public class GifTest extends JPanel implements ActionListener{
ImageIcon gif = new ImageIcon(GifTest.class.getResource("testgif.gif"));
JLabel label = new JLabel(gif);
Timer timer = new Timer(50, this);
int ctr;
public GifTest() {
add(label);
timer.setInitialDelay(0);
timer.start();
}
@Override
public void actionPerformed(ActionEvent e) {
ctr++;
if (ctr == 13){
timer.stop();
try {
Thread.sleep(1000);
} catch (InterruptedException i) {
}
}
}
public static void main(String[] args) {
JFrame frame = new JFrame("Gif Test");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new GifTest());
frame.setSize(150,150);
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
}
Для giftest.gif, это просто 6 слоев с номерами от 1 до 6 на них, спасенных с задержкой 50 мс.
Я был бы признателен за любую помощь.
Пс: Если окажется, что нет элегантного способа сделать это, также будет достаточно получить отображаемый в настоящее время фрейм. Таким образом, я мог бы попросить об этом и остановиться, когда это третий (соответственно 6-й) кадр. Из-за контекста задачи я предпочел бы модифицированную версию моего решения.
В худшем случае распакуйте изображения из GIF и отобразите каждое изображение с помощью таймера поворота. –
Зачем вам Thread.sleep (1000)? –
Просто чтобы не допустить, чтобы анимация продолжалась в ближайшее время, так что я могу видеть, что представляет собой 13-й кадр. – Kenji