java一道有趣的动画题。 用上面的图片实现一个程序,实现3个小图片逆时针旋转,大图片做背景顺时针旋转。看起来挺简单,其实并不容易,有兴趣的朋友可以试试。 解决方案 » 免费领取超大流量手机卡,每月29元包185G流量+100分钟通话, 中国电信官方发货 抛砖引玉一下,只有最重要的一些代码,重点是用好AffineTransform这个类:public class Test extends JLabel { private BufferedImage[] images = new BufferedImage[16]; private int index; public Test(BufferedImage original) { for (int i = 0; i < images.length; i++) { double theta = -2 * Math.PI * i / images.length; BufferedImage img = new BufferedImage(original.getWidth(), original.getHeight(), BufferedImage.TYPE_INT_ARGB); Graphics2D g2d = img.createGraphics(); g2d.drawRenderedImage(original, AffineTransform .getRotateInstance(theta, original.getWidth() / 2, original.getHeight() / 2)); images[i] = img; } } public void rotate() { index = (index + 1) % images.length; setIcon(new ImageIcon(images[index])); } public static void main(String[] args) throws Exception { final Test test = new Test(ImageIO.read(Test.class .getResourceAsStream("1335971717_7428.png"))); JFrame jf = new JFrame("Test"); jf.add(test); jf.setSize(100, 100); jf.setVisible(true); new Thread() { public void run() { try { for (;;) { test.rotate(); sleep(100); } } catch (InterruptedException ex) { ex.printStackTrace(); } } }.start(); }} bitblt之类,或者用DDraw,DX原来写过需要用到π公式 import javax.swing.*;import java.awt.event.*;import java.awt.*;class Syaringan extends JPanel{ private ImageIcon eye; private int x; private int y; private boolean ini = true; private double angle = 0; private int dAngle = 0; //控制旋转角度 private boolean up = true; private Graphics2D g; Syaringan(ImageIcon eye){ this.eye = eye; setVisible(false); setSize(eye.getIconWidth()+2,eye.getIconHeight()+2); } //初始化图片中心位置 private void fresh(){ if(ini){ x = this.getWidth()/2-eye.getIconWidth()/2; y = this.getHeight()/2-eye.getIconHeight()/2; ini = false; } } private int kt = Environment.dT/10; public void draw(Graphics2D g2D){ fresh(); //kt—每3帧动画改变旋转加速度 if(kt==3) { if(dAngle<-20) { dAngle++; up = true; } else if(dAngle>20) { dAngle--; up = false; } else if(dAngle<=20 && dAngle>=-20) { if(up) dAngle++; else dAngle--; } angle += dAngle; kt = 1; } else kt++; //旋转图片 Image offScreen = createImage(this.getSize().width,this.getSize().height); g = (Graphics2D)offScreen.getGraphics(); g.rotate(Math.toRadians(angle),x+eye.getIconWidth()/2,y+eye.getIconHeight()/2); g.drawImage(eye.getImage(),x,y,this); g2D.drawImage(offScreen,this.getX(),this.getY(),null); } public static void main(String[] args){ JFrame frame = new JFrame(); frame.add(new Environment(),BorderLayout.CENTER); frame.setTitle("写轮眼"); frame.setSize(400+8,400+34); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}class Environment extends JPanel{ static final int dT = 20; private Timer timer = new Timer(dT,new TimerListener()); //背景每次的旋转角度 private double angle = 0; private ImageIcon background = new ImageIcon("eyeBK.png"); private ImageIcon eye1 = new ImageIcon("eye1.png"); private ImageIcon eye2 = new ImageIcon("eye2.png"); private ImageIcon eye3 = new ImageIcon("eye3.png"); private Syaringan Seye1 = new Syaringan(eye1); private Syaringan Seye2 = new Syaringan(eye2); private Syaringan Seye3 = new Syaringan(eye3); Environment(){ setLayout(null); timer.start(); } boolean ini = true; private Graphics g = this.getGraphics(); private class TimerListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e){ fresh(); angle = 1; repaint(); } } private int x; private int y; private void fresh(){ if(ini){ Seye1.setLocation(getWidth()/7*2,getWidth()/7*2); Seye2.setLocation(getWidth()/7*5,getWidth()/7*2); Seye3.setLocation(getWidth()/2,getWidth()/7*5); add(Seye1); add(Seye2); add(Seye3); x = getWidth()/2-background.getIconWidth()/2; y = getHeight()/2-background.getIconHeight()/2; ini = false; } } @Override public void update(Graphics g){ paint(g); System.out.println("update"); } private Image offScreen; private Graphics drawOffScreen; @Override public void paint(Graphics g){ if(offScreen == null) { offScreen = createImage(this.getSize().width,this.getSize().height); drawOffScreen = offScreen.getGraphics(); } //清除缓冲屏幕的画面 drawOffScreen.setColor(getBackground()); drawOffScreen.fillRect(0, 0, this.getSize().width, this.getSize().height); //画到缓冲区 Graphics2D g2D = (Graphics2D)drawOffScreen; g2D.rotate(Math.toRadians(angle),x+background.getIconWidth()/2,y+background.getIconHeight()/2); g2D.drawImage(background.getImage(),x,y,this); Seye1.draw(g2D); Seye2.draw(g2D); Seye3.draw(g2D); //将缓冲屏幕贴到主屏幕 g.drawImage(offScreen,0,0,this); }}//我写出来的,但是有问题,大家帮忙看看好吗? 各位 牛人加油 小弟学习ing...... 哈哈,请教高人,终于得出了无BUG的代码。import javax.swing.*;import java.awt.event.*;import java.awt.*;class Syaringan extends JPanel{ private ImageIcon eye; private int x; private int y; private boolean ini = true; private double angle = 0; private int dAngle = 0; //控制旋转角度 private boolean up = true; private Graphics2D g; Syaringan(ImageIcon eye){ this.eye = eye; setVisible(false); setSize(eye.getIconWidth()+2,eye.getIconHeight()+2); } //初始化图片中心位置 private void fresh(){ if(ini){ x = this.getWidth()/2-eye.getIconWidth()/2; y = this.getHeight()/2-eye.getIconHeight()/2; ini = false; } } private int kt = Environment.dT/10; public void draw(Graphics2D g2D){ fresh(); //kt—每3帧动画改变旋转加速度 if(kt==3) { if(dAngle<-20) { dAngle++; up = true; } else if(dAngle>20) { dAngle--; up = false; } else if(dAngle<=20 && dAngle>=-20) { if(up) dAngle++; else dAngle--; } angle += dAngle; kt = 1; } else kt++; //旋转图片 Image offScreen = createImage(this.getSize().width,this.getSize().height); g = (Graphics2D)offScreen.getGraphics(); // ---------- 增加下面的代码使得背景透明 ----------------- offScreen = g.getDeviceConfiguration().createCompatibleImage( offScreen.getWidth(null), offScreen.getHeight(null), Transparency.TRANSLUCENT); g.dispose(); g = (Graphics2D) offScreen.getGraphics(); // ---------- 背景透明代码结束 ----------------- g.rotate(Math.toRadians(angle),x+eye.getIconWidth()/2,y+eye.getIconHeight()/2); g.drawImage(eye.getImage(),x,y,this); g2D.drawImage(offScreen,this.getX(),this.getY(),null); } public static void main(String[] args){ JFrame frame = new JFrame(); frame.add(new Environment(),BorderLayout.CENTER); frame.setTitle("写轮眼"); frame.setSize(400+8,400+34); frame.setResizable(false); frame.setLocationRelativeTo(null); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); }}class Environment extends JPanel{ static final int dT = 20; private Timer timer = new Timer(dT,new TimerListener()); //背景每次的旋转角度 private double angle = 0; private ImageIcon background = new ImageIcon("eyeBK.png"); private ImageIcon eye1 = new ImageIcon("eye1.png"); private ImageIcon eye2 = new ImageIcon("eye2.png"); private ImageIcon eye3 = new ImageIcon("eye3.png"); private Syaringan Seye1 = new Syaringan(eye1); private Syaringan Seye2 = new Syaringan(eye2); private Syaringan Seye3 = new Syaringan(eye3); Environment(){ setLayout(null); timer.start(); } boolean ini = true; private Graphics g = this.getGraphics(); private class TimerListener implements ActionListener{ @Override public void actionPerformed(ActionEvent e){ fresh(); angle = 1; repaint(); } } private int x; private int y; private void fresh(){ if(ini){ Seye1.setLocation(getWidth()/7*2,getWidth()/7*2); Seye2.setLocation(getWidth()/7*5,getWidth()/7*2); Seye3.setLocation(getWidth()/2,getWidth()/7*5); add(Seye1); add(Seye2); add(Seye3); x = getWidth()/2-background.getIconWidth()/2; y = getHeight()/2-background.getIconHeight()/2; ini = false; } } @Override public void update(Graphics g){ paint(g); System.out.println("update"); } private Image offScreen; private Graphics drawOffScreen; @Override public void paint(Graphics g){ if(offScreen == null) { offScreen = createImage(this.getSize().width,this.getSize().height); drawOffScreen = offScreen.getGraphics(); } //清除缓冲屏幕的画面 drawOffScreen.setColor(getBackground()); drawOffScreen.fillRect(0, 0, this.getSize().width, this.getSize().height); //画到缓冲区 Graphics2D g2D = (Graphics2D)drawOffScreen; g2D.rotate(Math.toRadians(angle),x+background.getIconWidth()/2,y+background.getIconHeight()/2); g2D.drawImage(background.getImage(),x,y,this); Seye1.draw(g2D); Seye2.draw(g2D); Seye3.draw(g2D); //将缓冲屏幕贴到主屏幕 g.drawImage(offScreen,0,0,this); }} 递归求取相加等于七的所有组合 小球移动 小弟做的小孩做算术的题目,省的自己出题目了。 java里有没有类似于windows上的waitForMultipleObjests 的API? 大家过年好,请教一个关于swing中tree的问题 访问Sybase数据库问题 谢谢~ 如何用jad?谢谢 jb7中如何单独编译一个java,就象编译单独一个helloworld的文件成class? 谁能看一看我的代码错在哪了???? ●请问,谁有SL-275教材的电子版?● 做java开发的用什么操作系统 请指教!JAVA 中 判断是不是数字 的两段 代码 有什么区别??
for (int i = 0; i < images.length; i++) {
double theta = -2 * Math.PI * i / images.length;
BufferedImage img = new BufferedImage(original.getWidth(),
original.getHeight(), BufferedImage.TYPE_INT_ARGB);
Graphics2D g2d = img.createGraphics();
g2d.drawRenderedImage(original, AffineTransform
.getRotateInstance(theta,
original.getWidth() / 2,
original.getHeight() / 2));
images[i] = img;
}
} public void rotate() {
index = (index + 1) % images.length;
setIcon(new ImageIcon(images[index]));
} public static void main(String[] args) throws Exception {
final Test test = new Test(ImageIO.read(Test.class
.getResourceAsStream("1335971717_7428.png")));
JFrame jf = new JFrame("Test");
jf.add(test);
jf.setSize(100, 100);
jf.setVisible(true);
new Thread() { public void run() { try {
for (;;) {
test.rotate();
sleep(100);
}
} catch (InterruptedException ex) {
ex.printStackTrace(); }
}
}.start();
}}
import java.awt.event.*;
import java.awt.*;
class Syaringan extends JPanel{
private ImageIcon eye;
private int x;
private int y;
private boolean ini = true;
private double angle = 0;
private int dAngle = 0;
//控制旋转角度
private boolean up = true;
private Graphics2D g;
Syaringan(ImageIcon eye){
this.eye = eye;
setVisible(false);
setSize(eye.getIconWidth()+2,eye.getIconHeight()+2);
}
//初始化图片中心位置
private void fresh(){
if(ini){
x = this.getWidth()/2-eye.getIconWidth()/2;
y = this.getHeight()/2-eye.getIconHeight()/2;
ini = false;
}
}
private int kt = Environment.dT/10;
public void draw(Graphics2D g2D){
fresh();
//kt—每3帧动画改变旋转加速度
if(kt==3)
{
if(dAngle<-20)
{
dAngle++;
up = true;
}
else if(dAngle>20)
{
dAngle--;
up = false;
}
else if(dAngle<=20 && dAngle>=-20)
{
if(up)
dAngle++;
else dAngle--;
}
angle += dAngle;
kt = 1;
}
else kt++;
//旋转图片
Image offScreen = createImage(this.getSize().width,this.getSize().height);
g = (Graphics2D)offScreen.getGraphics();
g.rotate(Math.toRadians(angle),x+eye.getIconWidth()/2,y+eye.getIconHeight()/2);
g.drawImage(eye.getImage(),x,y,this);
g2D.drawImage(offScreen,this.getX(),this.getY(),null);
}
public static void main(String[] args){
JFrame frame = new JFrame();
frame.add(new Environment(),BorderLayout.CENTER);
frame.setTitle("写轮眼");
frame.setSize(400+8,400+34);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}class Environment extends JPanel{
static final int dT = 20;
private Timer timer = new Timer(dT,new TimerListener());
//背景每次的旋转角度
private double angle = 0;
private ImageIcon background = new ImageIcon("eyeBK.png");
private ImageIcon eye1 = new ImageIcon("eye1.png");
private ImageIcon eye2 = new ImageIcon("eye2.png");
private ImageIcon eye3 = new ImageIcon("eye3.png");
private Syaringan Seye1 = new Syaringan(eye1);
private Syaringan Seye2 = new Syaringan(eye2);
private Syaringan Seye3 = new Syaringan(eye3);
Environment(){
setLayout(null);
timer.start();
}
boolean ini = true;
private Graphics g = this.getGraphics();
private class TimerListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
fresh();
angle = 1;
repaint();
}
}
private int x;
private int y;
private void fresh(){
if(ini){
Seye1.setLocation(getWidth()/7*2,getWidth()/7*2);
Seye2.setLocation(getWidth()/7*5,getWidth()/7*2);
Seye3.setLocation(getWidth()/2,getWidth()/7*5);
add(Seye1);
add(Seye2);
add(Seye3);
x = getWidth()/2-background.getIconWidth()/2;
y = getHeight()/2-background.getIconHeight()/2;
ini = false;
}
}
@Override
public void update(Graphics g){
paint(g);
System.out.println("update");
}
private Image offScreen;
private Graphics drawOffScreen;
@Override
public void paint(Graphics g){
if(offScreen == null)
{
offScreen = createImage(this.getSize().width,this.getSize().height);
drawOffScreen = offScreen.getGraphics();
}
//清除缓冲屏幕的画面
drawOffScreen.setColor(getBackground());
drawOffScreen.fillRect(0, 0, this.getSize().width, this.getSize().height);
//画到缓冲区
Graphics2D g2D = (Graphics2D)drawOffScreen;
g2D.rotate(Math.toRadians(angle),x+background.getIconWidth()/2,y+background.getIconHeight()/2);
g2D.drawImage(background.getImage(),x,y,this);
Seye1.draw(g2D);
Seye2.draw(g2D);
Seye3.draw(g2D);
//将缓冲屏幕贴到主屏幕
g.drawImage(offScreen,0,0,this);
}
}//我写出来的,但是有问题,大家帮忙看看好吗?
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
class Syaringan extends JPanel{
private ImageIcon eye;
private int x;
private int y;
private boolean ini = true;
private double angle = 0;
private int dAngle = 0;
//控制旋转角度
private boolean up = true;
private Graphics2D g;
Syaringan(ImageIcon eye){
this.eye = eye;
setVisible(false);
setSize(eye.getIconWidth()+2,eye.getIconHeight()+2);
}
//初始化图片中心位置
private void fresh(){
if(ini){
x = this.getWidth()/2-eye.getIconWidth()/2;
y = this.getHeight()/2-eye.getIconHeight()/2;
ini = false;
}
}
private int kt = Environment.dT/10;
public void draw(Graphics2D g2D){
fresh();
//kt—每3帧动画改变旋转加速度
if(kt==3)
{
if(dAngle<-20)
{
dAngle++;
up = true;
}
else if(dAngle>20)
{
dAngle--;
up = false;
}
else if(dAngle<=20 && dAngle>=-20)
{
if(up)
dAngle++;
else dAngle--;
}
angle += dAngle;
kt = 1;
}
else kt++;
//旋转图片
Image offScreen = createImage(this.getSize().width,this.getSize().height);
g = (Graphics2D)offScreen.getGraphics();
// ---------- 增加下面的代码使得背景透明 -----------------
offScreen = g.getDeviceConfiguration().createCompatibleImage(
offScreen.getWidth(null), offScreen.getHeight(null),
Transparency.TRANSLUCENT);
g.dispose();
g = (Graphics2D) offScreen.getGraphics();
// ---------- 背景透明代码结束 -----------------
g.rotate(Math.toRadians(angle),x+eye.getIconWidth()/2,y+eye.getIconHeight()/2);
g.drawImage(eye.getImage(),x,y,this);
g2D.drawImage(offScreen,this.getX(),this.getY(),null);
}
public static void main(String[] args){
JFrame frame = new JFrame();
frame.add(new Environment(),BorderLayout.CENTER);
frame.setTitle("写轮眼");
frame.setSize(400+8,400+34);
frame.setResizable(false);
frame.setLocationRelativeTo(null);
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}class Environment extends JPanel{
static final int dT = 20;
private Timer timer = new Timer(dT,new TimerListener());
//背景每次的旋转角度
private double angle = 0;
private ImageIcon background = new ImageIcon("eyeBK.png");
private ImageIcon eye1 = new ImageIcon("eye1.png");
private ImageIcon eye2 = new ImageIcon("eye2.png");
private ImageIcon eye3 = new ImageIcon("eye3.png");
private Syaringan Seye1 = new Syaringan(eye1);
private Syaringan Seye2 = new Syaringan(eye2);
private Syaringan Seye3 = new Syaringan(eye3);
Environment(){
setLayout(null);
timer.start();
}
boolean ini = true;
private Graphics g = this.getGraphics();
private class TimerListener implements ActionListener{
@Override
public void actionPerformed(ActionEvent e){
fresh();
angle = 1;
repaint();
}
}
private int x;
private int y;
private void fresh(){
if(ini){
Seye1.setLocation(getWidth()/7*2,getWidth()/7*2);
Seye2.setLocation(getWidth()/7*5,getWidth()/7*2);
Seye3.setLocation(getWidth()/2,getWidth()/7*5);
add(Seye1);
add(Seye2);
add(Seye3);
x = getWidth()/2-background.getIconWidth()/2;
y = getHeight()/2-background.getIconHeight()/2;
ini = false;
}
}
@Override
public void update(Graphics g){
paint(g);
System.out.println("update");
}
private Image offScreen;
private Graphics drawOffScreen;
@Override
public void paint(Graphics g){
if(offScreen == null)
{
offScreen = createImage(this.getSize().width,this.getSize().height);
drawOffScreen = offScreen.getGraphics();
}
//清除缓冲屏幕的画面
drawOffScreen.setColor(getBackground());
drawOffScreen.fillRect(0, 0, this.getSize().width, this.getSize().height);
//画到缓冲区
Graphics2D g2D = (Graphics2D)drawOffScreen;
g2D.rotate(Math.toRadians(angle),x+background.getIconWidth()/2,y+background.getIconHeight()/2);
g2D.drawImage(background.getImage(),x,y,this);
Seye1.draw(g2D);
Seye2.draw(g2D);
Seye3.draw(g2D);
//将缓冲屏幕贴到主屏幕
g.drawImage(offScreen,0,0,this);
}
}