用上面的图片实现一个程序,实现3个小图片逆时针旋转,大图片做背景顺时针旋转。
看起来挺简单,其实并不容易,有兴趣的朋友可以试试。

解决方案 »

  1.   

    抛砖引玉一下,只有最重要的一些代码,重点是用好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();
      }}
      

  2.   

    bitblt之类,或者用DDraw,DX原来写过需要用到π公式
      

  3.   

    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);
    }
    }//我写出来的,但是有问题,大家帮忙看看好吗?
      

  4.   

    各位 牛人加油 小弟学习ing......
      

  5.   

    哈哈,请教高人,终于得出了无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);
    }
    }