У меня довольно простая анимация, текст в большом шрифте перемещается непрерывно (пиксель за пикселем) влево. Текст сначала преобразуется в изображение, затем запускается задача таймера, которая несколько раз (каждые 10-20 мс) уменьшает координату x изображения на 1 и выполняет перерисовку().
Эта программа показывает странное поведение некоторых систем. На моем ПК с картой nVidia он работает гладко. На моем ноутбуке Vaio, на BeagleBoneBlack и на другом Mac, он сильно заикается. Кажется, что на некоторое время пауза, затем прыгайте влево около 10 пикселей, снова приостанавливайте и т.д.
Что пень меня, так это то, что в этих системах анимация только заикается, если вы не касаетесь мыши. Пока вы перемещаете курсор мыши в окне, независимо от того, как медленно или перетаскиваете окно вокруг, анимация работает совершенно гладкой!
Может кто-нибудь объяснить это? Вот программа:
import java.awt.*;
import java.awt.image.*;
import java.awt.event.*;
import javax.swing.*;
import java.io.*;
import java.util.*;
class Textimg extends JComponent
{
String str;
Font font;
int x = 0;
final int ytext = 136;
Image img;
public Textimg(String s)
{
str = s;
font = new Font("Noserif", Font.PLAIN, 96);
setLayout(null);
}
protected void paintComponent(Graphics g)
{
if (img == null)
{
img = createImage(4800, 272);
Graphics gr = img.getGraphics();
gr.setFont(font);
gr.setColor(Color.BLACK);
gr.fillRect(0, 0, 4800, 272);
gr.setColor(new Color(135, 175, 0));
gr.drawString(str, 0, ytext);
gr.dispose();
}
g.drawImage(img, x, 0, this);
}
public void addX(int dif)
{
if (isVisible())
{
x = x + dif;
Graphics g = getGraphics();
if (g != null) paintComponent(g);
}
}
}
public class Banner extends JFrame
{
StringBuffer buf;
int sleeptime = 10;
Banner(String path) throws IOException
{
setSize(new Dimension(480, 272));
setTitle("Java Test");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setLayout(null);
BufferedReader reader = new BufferedReader(
new InputStreamReader(new FileInputStream(path), "UTF-8"));
buf = new StringBuffer();
while (true)
{
String line = reader.readLine();
if (line == null) break;
buf.append(line);
}
final Textimg textimg = new Textimg(buf.toString());
add(textimg);
textimg.setBounds(0, 0, 480, 272);
final javax.swing.Timer timer = new javax.swing.Timer(200, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
textimg.addX(-1);
}
});
timer.setDelay(sleeptime);
timer.start();
}
//----------------------------------------------------------------------
public static void main(String[] args) throws Exception
{
new Banner(args[0]).setVisible(true);
}
}