`
jswing
  • 浏览: 10714 次
社区版块
存档分类
最新评论

2d 气泡特效

 
阅读更多

在这个例子里,我们会看到很多五颜六色的泡泡出现在屏幕上,逐渐变大然后消失,先来张截图看看效果

 

效果还不错吧

 

程序的架构很简单,从JPanel继承并重写paintComponent,然后将其设置成JFrame的ContentPane即可

先来看看架构代码,具体的绘制代码稍后奉上

 

public class MyBubbles extends JPanel  {
	
	
	@Override
	protected void paintComponent(Graphics g) {
		// TODO Auto-generated method stub
		super.paintComponent(g);
	}

	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable(){
			@Override
			public void run() {
				JFrame frame=new JFrame();
				frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				frame.setSize(400, 400);
				frame.setContentPane(new MyBubbles());
				frame.setLocationRelativeTo(null);
				frame.setVisible(true);
			}
		});
	}
}

 

 这些代码很简单,做过swing的童鞋应该毫无压力,需要注意的有两点:

1、setLocationRelativeTo方法可以很方便的将窗体居中

2、初始化窗体的代码是交给SwingUtilities来执行的,这涉及到swing的线程安全问题,这个话题很大,我在这就不赘述了,感兴趣的童鞋请猛戳这里:http://twaver.servasoft.com/?p=531

 

ok,我们开始思考怎样做成这种效果

首先气泡的个数和最大size都是固定的,代码如下:

 

 

Ellipse2D.Double[] ellipses;//气泡数组
int maxSize=60;//气泡最大像素
 

 

我们用椭圆来表示气泡,即Ellipse2D,Ellipse2D.Double是Ellipse2D的子类,它的坐标和大小都是double表示的,此外Ellipse2D还有个子类叫Ellipse2D.Float,顾名思义,它的坐标和大小用float来表示。

 

在构造方法中,我们初始化气泡数组

 

 

this.setBackground(Color.BLACK);//背景色
		ellipses=new Ellipse2D.Double[25];
		for(int i=0;i<ellipses.length;i++){
			ellipses[i]=new Ellipse2D.Double();
			double size=Math.random()*maxSize;
			this.setRandomXY(i, size, 400, 400);
		}
private void setRandomXY(int i,double size,double width,double height){
		double x=Math.random()*(width-maxSize/2);
		double y=Math.random()*(height-maxSize/2);
		ellipses[i].setFrame(x, y, size,size);
	}

 为了营造气泡大小不一的效果,我们使用随机数产生气泡size,为了实现代码重用,我们将设置气泡尺寸和位置的相关代码抽取到一个单独的方法中。

 

 

动画效果使用javax.swing.Timer实现(注意不是java.util.Timer),定时重绘气泡,改变气泡的尺寸。

在构造方法中创建一个Timer

 

timer=new Timer(30, this);
timer.start();

 为了简化代码,我们的MyBubbles实现了ActionListener接口,将自身交给timer调用。调用的代码很简单,只有一句话:repaint();

 

终于到了最关键的绘制部分了

 

	@Override
	protected void paintComponent(Graphics g) {
		super.paintComponent(g);
		Graphics2D g2d=(Graphics2D)g;
		g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);   
		step(this.getWidth(),this.getHeight());
		render((Graphics2D)g);
	}
	private void step(double w,double h){
		for(int i=0;i<ellipses.length;i++){
			if(ellipses[i].width>maxSize){
				setRandomXY(i,1,w,h);
			}else{
				ellipses[i].setFrame(ellipses[i].getX(),ellipses[i].getY(), ellipses[i].getWidth()+1, ellipses[i].getHeight()+1);
			}
		}
	}
	private void render(Graphics2D g){
		for(int i=0;i<ellipses.length;i++){
			g.setColor(colors[i%colors.length]);
			g.setStroke(new BasicStroke(2));
			g.draw(ellipses[i]);
		}
	}

 paintComponent方法是我们重写JPanel的,每当Timer调用到repaint()时,这个方法也会马上被调用。

我们将改变气泡的尺寸的方法放到step中,将绘制方法放到render中,这样整个绘制过程看起来就很清晰了:

在step中,我们遍历气泡数组增大尺寸,当尺寸>maxSize时,就调用我们之前的setRandomXY方法重置气泡。

render方法中,遍历气泡设置颜色和画笔,并将气泡画到屏幕上。

我们在绘制的时候打开了反锯齿:g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);

如果没有这句代码,画面会惨不忍睹,大家可以自行测试。  

 

完整的代码见附件。

参考:http://zetcode.com/tutorials/java2dtutorial/effects/

  • 大小: 26.5 KB
分享到:
评论
1 楼 alvin198761 2013-05-03  
哦,swing的例子里面有个一模一样的,但是楼主这种自己实现的精神还是不错

相关推荐

    Unity 特效(气泡生产 上升 破损效果)

    在这个特定的“Unity 特效(气泡生产 上升 破损效果)”项目中,我们将深入探讨如何在Unity中创建和实现气泡的生成、上升以及破碎的视觉特效。 首先,气泡的生成通常涉及到粒子系统(Particle System)。Unity的粒子...

    HTML5鼠标控制彩色气泡特效.zip

    在气泡特效中,这些方法会被用来创建和绘制每一个彩色气泡。 为了实现鼠标控制的效果,我们需要监听`mousemove`事件。当用户在网页上移动鼠标时,这个事件会被触发,我们可以获取到鼠标的当前位置。然后,将这些...

    Canvas点赞喜欢爱心气泡特效.zip

    "Canvas点赞喜欢爱心气泡特效"是利用这一特性实现的一种互动效果,当用户点击一个圆形的爱心按钮时,页面上会动态地生成并飘散出爱心形状的气泡,营造出一种生动有趣的点赞氛围。 首先,我们来看"JS特效-其它代码...

    HTML5 Canvas水波纹气泡特效.zip

    这款"HTML5 Canvas水波纹气泡特效"是利用Canvas API结合jQuery库来实现的一种互动动画效果,它能为网页增添生动有趣的交互体验。 1. **HTML5 Canvas**: HTML5的新特性之一,提供了一个二维绘图环境,开发者可以通过...

    html5 canvas绘制梦幻气泡背景动画特效

    在这个“html5 canvas绘制梦幻气泡背景动画特效”中,我们将深入探讨如何利用Canvas API来创建动态的、视觉吸引人的气泡飘动效果。 首先,让我们了解一下Canvas的基本用法。在HTML中,你需要创建一个`&lt;canvas&gt;`元素...

    Canvas苏打水气泡动画特效.zip

    4. **动画原理**:这个气泡特效是通过不断重绘并更新气泡的位置来实现的。每帧之间的时间差通过`requestAnimationFrame()`函数控制,使得气泡看起来像是在上升。 5. **气泡生成与运动**:每个气泡通常是一个圆形,...

    Canvas鼠标经过气泡增多特效.zip

    "Canvas鼠标经过气泡增多特效.zip"这个压缩包内包含了一个使用Canvas实现的互动特效,当鼠标在画布上移动时,会生成越来越多的圆点泡泡,形成一种动态的光标效果。这个特效主要依赖于JavaScript和Canvas API来完成,...

    html5 canvas绘制圆形气泡背景动画特效

    通过调整气泡的生成频率、大小范围、颜色随机性以及速度,可以进一步定制这个特效,使其更加符合设计需求。 这个压缩包文件"texiao1891_1560680783"可能包含了实现这个特效的完整代码和资源,你可以解压并研究其中...

    水下冒气泡的特效动画

    3. **动画帧序列**:对于2D动画,可能需要绘制一系列帧来表现气泡的形态变化。从一个小圆点开始,逐渐膨胀成一个完整的气泡形状,然后在达到一定高度后逐渐消散。这种序列可以使用矢量图形软件或像素绘画工具来创建...

    HTML5 Canvas苏打水气泡动画特效

    要实现气泡动画特效,我们需要完成以下几个关键步骤: 1. **创建Canvas元素**:在HTML文件中,添加一个`&lt;canvas&gt;`标签,设置其id以便于在JavaScript中引用。 2. **获取Canvas上下文**:在JavaScript中,通过`...

    HTML5 Canvas疯狂气泡动画特效特效代码

    在这个“HTML5 Canvas疯狂气泡动画特效特效代码”中,我们将深入探讨如何利用Canvas API来实现一个动态的气泡动画效果,并且介绍如何通过鼠标滚轮来控制动画的行为。 首先,让我们了解一下HTML5 Canvas的基本概念。...

    纯CSS3创意气泡动画特效.zip

    【标题】"纯CSS3创意气泡动画特效.zip"揭示了这个压缩包包含的资源是关于使用纯CSS3实现的一种创新、美观的气泡动画效果。CSS3是层叠样式表(Cascading Style Sheets)的第三版,它极大地扩展了CSS的功能,包括新的...

    html5 canvas透明气泡网页背景动画特效

    在这个特效中,开发者首先会创建一系列透明气泡的实例,每个气泡都有自己的位置、大小、速度等属性。这些属性可以通过随机函数生成,以增加视觉的随机性和动态性。例如,可以使用`Math.random()`生成气泡的初始位置...

    HTML5 Canvas全屏彩色气泡动画特效

    首先,让我们了解一下Canvas的基本结构。...通过Canvas,开发者可以创建出各种复杂且互动的Web动画,这个全屏彩色气泡特效就是一个生动的例子,展示了HTML5 Canvas在增强用户体验方面的巨大潜力。

    Unity粒子特效,烟,火,水,爆炸,枪击等特效

    Unity3D是一款强大的跨平台游戏开发引擎,以其优秀的3D和2D图形渲染能力、直观的可视化编程界面以及丰富的社区资源而广受开发者喜爱。在游戏制作中,粒子特效是不可或缺的一部分,它们能够极大地增强游戏视觉表现力...

    HTML5 Canvas气泡背景特效.zip

    在这个“HTML5 Canvas气泡背景特效”压缩包中,包含了一个使用Canvas技术实现的气泡飘动背景的示例。这个特效可以为网站增添一种轻盈、动态的氛围,尤其适用于营造轻松、活泼的用户体验。 首先,让我们了解一下...

    html5 svg鼠标拖动气泡滑块动画特效

    在这款特效中,SVG被用来创建气泡和滑块的图形,通过CSS和JavaScript控制其形状、颜色以及动态行为。 动画部分主要依赖于SVG的`&lt;animate&gt;`元素,它可以为图形的属性设置关键帧动画。在这个例子中,当我们拖动气泡时...

Global site tag (gtag.js) - Google Analytics