Простая анимация на java


Одной из самых интересных тем для начинающих изучать любой язык программирования является тема анимации. Во многих этих языках заставить двигаться кружок не намного сложнее, чем просто нарисовать его. Не является исключением и Java. Итак, рассмотрим простейшую анимацию на java: заставим двигаться кружок по нашему желанию.

Для самых нетерпеливых вот ссылки на готовый jar - MovingCircle.jar и на полный архив с исходником и классами - MovingCircle.zip

сертификат
По сути дела ничего сложного: создаем синий круг, по нажатию кнопки его можно заставить двигаться по диагонали с верхнего левого угла к нижнему правому. В конструкторе класса MovingCircle два параметра — это цвет и скорость (точнее, наоборот, величина замедления). Кроме этого, скорость регулируют еще две строки 57 (x++; - скорость движения по горизонтали) и 58 (y++; - скорость движения по вертикали).

Итак, рисуем кружок зеленого цвета, задаем параметры. В итоге на экране после запуска программы появляется окно с размерами 600 на 550 точек (строка кода 89). В этом окне два поля: рабочая область слева с белым фоном на котором герой нашей статьи - зеленый круг, а справа кнопка: по нажатию кружок начинает двигаться, нажать еще раз - останавливается.

На основе этой простейшей анимации на java можно делать гораздо более сложные. Имеется таймер, все параметры расписаны достаточно подробно: можно, к примеру, использовать квадрат, а не круг. На основе этого примера анимации на java нетрудно уже будет создать самостоятельно анимации других типов. В программе нет комментариев, код должен быть понятен.

А вот и сам код. Можно его скопировать, а можно просто скачать готовый архив с файлом исходника и классами - MovingCircle.zip, либо уже готовый к употреблению архив jar - MovingCircle.jar. Для компилирования и запуска использовалась Java SE Development Kit 7u45 на Windows 7, а также Ubunty 12.04, но должно заработать на любом компьютере, на котором установлена хотя бы jre, хотя бы 2 версии.

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.Ellipse2D;
import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.Timer;
 
@SuppressWarnings("serial")
public class MovingCircle extends JComponent implements ActionListener {
  private double scale;
  private Color color;
  private Timer timer;
  public double x =10;
  public double y =10;
 
  public MovingCircle(Color color, int delay) {
    scale = 1.0;
    timer = new Timer(delay, this);
    this.color = color;
    setPreferredSize(new Dimension(500, 500));
  }
 
  public void start() {
    timer.start();
  }
 
  public void stop() {
    timer.stop();
  }
 
  @Override
  public void actionPerformed(ActionEvent arg0) {   
    repaint();
  }
 
  @Override
  protected void paintComponent(Graphics g) {
    Graphics2D g2d = (Graphics2D) g;
    g2d.setColor(Color.white);
    int width = 500;
    int height = 500;
    g.fillRect(0, 0, width, height);
    g2d.setColor(Color.black);
    g2d.drawRect(0, 0, width - 1, height - 1);	
    g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    g2d.setColor(color);	
    g2d.scale(scale, scale);	
    x++;
    y++;
    Ellipse2D el = new Ellipse2D.Double(x, y, 20, 20);
    g2d.fill(el);
  }
 
  public static void main(String[] args) {
    SwingUtilities.invokeLater(new Runnable() {
      public void run() {
        JFrame frame = new JFrame("Moving Circle");
        JPanel panel = new JPanel();
        final MovingCircle MovingCircleGreen = new MovingCircle(Color.green, 20);
        panel.add(MovingCircleGreen);    
        frame.getContentPane().add(panel);
        final JButton button = new JButton("Start");
        button.addActionListener(new ActionListener() {
          private boolean pulsing = false;
          @Override
          public void actionPerformed(ActionEvent e) {
            if (pulsing) {
              pulsing = false;
              MovingCircleGreen.stop();     
              button.setText("Start");
            } else {
              pulsing = true;
              MovingCircleGreen.start();   
              button.setText("Stop");
            }
          }
        });
        panel.add(button);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(600, 550);
        frame.setVisible(true);
      }
    });
  }
}
Автор этого материала - я - Пахолков Юрий. Я оказываю услуги по написанию программ на языках Java, C++, C# (а также консультирую по ним) и созданию сайтов. Работаю с сайтами на CMS OpenCart, WordPress, ModX и самописными. Кроме этого, работаю напрямую с JavaScript, PHP, CSS, HTML - то есть могу доработать ваш сайт или помочь с веб-программированием. Пишите сюда.

тегистатьи IT, java, анимация




Отправляя сообщение я подтверждаю, что ознакомлен и согласен с политикой конфиденциальности данного сайта.




Утро
Урок 8. Выводим цикл с директивой v-for в Vue 3
Пулевидная кривая, Эллиптическая кривая и Циссоида Диокла на C++