基于JAVA 的Canvas 实现动画效果(升国旗)

版权声明:版权声明:本文为博主原创文章,博客地址:http://blog.csdn.net/qq_37808895,未经博主允许不得转载。 https://blog.csdn.net/qq_37808895/article/details/88622772

升国旗小程序


定义了一个内部类FlagJFrame画出初始界面
然后用Timer重画

package animation;

import java.applet.Applet;
import java.applet.AudioClip;
import java.awt.Canvas;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.io.File;
import java.net.URI;
import java.net.URL;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class FlagJFrame extends JFrame implements ActionListener{

	public boolean sign;
	private FlagCanvas1 canvas1;
	private FlagCanvas canvas;
	File f;
	URI uri;
	URL url;
	
	
	public FlagJFrame(){
		super("升旗");
		Dimension dim=getToolkit().getScreenSize();
	    this.setBounds(dim.width/4,dim.height/4,dim.width/2,dim.height/2);
		setLocationRelativeTo(null);
		this.setBackground(Color.white);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
		JPanel jpanel=new JPanel();
		this.getContentPane().add(jpanel,"South");
		JButton button_start=new JButton("升旗");
		button_start.setFont(new Font("楷体",Font.BOLD,18));
		jpanel.add(button_start);
		button_start.addActionListener(this);
		this.canvas1=new FlagCanvas1();
		this.getContentPane().add(this.canvas1,"Center");
		this.setVisible(true);
			
	}
	
	
	public void actionPerformed(ActionEvent ev){
		this.getContentPane().remove(this.canvas1);
		this.canvas=new FlagCanvas();
		this.getContentPane().add(this.canvas,"Center");
		this.setVisible(true);	
		try{
			this.f=new File("song.wav");
			uri=f.toURI();
			url=uri.toURL();//解析地址
			AudioClip aau;
			aau=Applet.newAudioClip(url);
			aau.play();
			}catch(Exception e){e.printStackTrace();}
		
	}
	public static void main(String[] args) {
		new FlagJFrame();
	}
}
class FlagCanvas extends Canvas implements ActionListener{
	private Timer timer;
	private Flag flag;
	private static class Flag{
		int y;
		public boolean up;
		Flag(int y){
			this.y=y;
			boolean up=false;
		}
	}
	public FlagCanvas(){
		this.flag=new Flag(380);
		
		timer=new Timer(1200,this);
		timer.start();
	}
	public void paint(Graphics g){
		int x=this.getWidth();
		int y=this.getHeight();
		g.setColor(Color.black);
		g.drawLine(x*1/3,y,x*1/3,y*1/5);
		for(int i=1;i<6;i++){
			g.drawLine(x*1/3+i,y,x*1/3+i,y*1/5);//旗杆
		}
		g.setColor(Color.red);
		g.fillOval(x*4/5, y*1/50,100,100);//太阳
		g.fill3DRect(x*1/3+5,flag.y, 120, 80, true);
			flag.y=flag.up?91:flag.y-10;
			if(flag.y<=90){
				flag.up=!flag.up;
			}
			String str="升国旗奏唱国歌";
			/*String lyric[][]={{"起来"},{"不愿做奴隶的人们"},{"把我们的血肉铸成我们心的长城"},
			{"中华民族到了最危难的时候"},{"每个人都被迫发出最后的吼声"},{"起来,起来"},
			{"我们万众一心,冒着敌人的炮火"},
			{"前进前进前进进!"}};*/
			g.setFont(new Font("楷体",Font.BOLD,40));
			g.setColor(Color.darkGray);
			g.drawString(str,200,40);
			
			String lyric1="起来,不愿做奴隶的人们,把我们的血肉铸成我们心的长城,中华民族到了最危难的时候,",
				lyric2="每个人都被迫发出最后的吼声,起来,起来,我们万众一心,冒着敌人的炮火,前进前进前进进!";
			g.setFont(new Font("楷体",Font.BOLD,20));
			g.drawString(lyric1,0,70);
			g.drawString(lyric2,0,90);
	}
	public void actionPerformed(ActionEvent ev){
		repaint();
	}
	
	
}
//初静止场景
class FlagCanvas1 extends Canvas{
	public void paint(Graphics g){
		int x=this.getWidth();
		int y=this.getHeight();
		g.setColor(Color.black);
		g.drawLine(x*1/3,y,x*1/3,y*1/5);
		for(int i=1;i<6;i++){
			g.drawLine(x*1/3+i,y,x*1/3+i,y*1/5);//旗杆
		}
		g.setColor(Color.red);
		g.fillOval(x*4/5, y*1/50,100,100);//太阳
		g.fill3DRect(x*1/3+5,380, 120, 80, true);	
	}

}

预览图

最终效果图就是歌词显示红旗上升,并且过国歌响起。这里就不附上音乐文件文件(song.wav),网上下载即可
这里也用到了uri的音乐文件解析

try{
			this.f=new File("song.wav");
			uri=f.toURI();
			url=uri.toURL();//解析地址
			AudioClip aau;
			aau=Applet.newAudioClip(url);
			aau.play();
			}catch(Exception e){e.printStackTrace();
		}	

下面附上gif图
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/qq_37808895/article/details/88622772