在这个例子里,我们会看到很多五颜六色的泡泡出现在屏幕上,逐渐变大然后消失,先来张截图看看效果
效果还不错吧
程序的架构很简单,从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
分享到:
相关推荐
在气泡特效中,这些方法会被用来创建和绘制每一个彩色气泡。 为了实现鼠标控制的效果,我们需要监听`mousemove`事件。当用户在网页上移动鼠标时,这个事件会被触发,我们可以获取到鼠标的当前位置。然后,将这些...
在这个特定的“Unity 特效(气泡生产 上升 破损效果)”项目中,我们将深入探讨如何在Unity中创建和实现气泡的生成、上升以及破碎的视觉特效。 首先,气泡的生成通常涉及到粒子系统(Particle System)。Unity的粒子...
"Canvas点赞喜欢爱心气泡特效"是利用这一特性实现的一种互动效果,当用户点击一个圆形的爱心按钮时,页面上会动态地生成并飘散出爱心形状的气泡,营造出一种生动有趣的点赞氛围。 首先,我们来看"JS特效-其它代码...
这款"HTML5 Canvas水波纹气泡特效"是利用Canvas API结合jQuery库来实现的一种互动动画效果,它能为网页增添生动有趣的交互体验。 1. **HTML5 Canvas**: HTML5的新特性之一,提供了一个二维绘图环境,开发者可以通过...
在这个“html5 canvas绘制梦幻气泡背景动画特效”中,我们将深入探讨如何利用Canvas API来创建动态的、视觉吸引人的气泡飘动效果。 首先,让我们了解一下Canvas的基本用法。在HTML中,你需要创建一个`<canvas>`元素...
4. **动画原理**:这个气泡特效是通过不断重绘并更新气泡的位置来实现的。每帧之间的时间差通过`requestAnimationFrame()`函数控制,使得气泡看起来像是在上升。 5. **气泡生成与运动**:每个气泡通常是一个圆形,...
"Canvas鼠标经过气泡增多特效.zip"这个压缩包内包含了一个使用Canvas实现的互动特效,当鼠标在画布上移动时,会生成越来越多的圆点泡泡,形成一种动态的光标效果。这个特效主要依赖于JavaScript和Canvas API来完成,...
通过调整气泡的生成频率、大小范围、颜色随机性以及速度,可以进一步定制这个特效,使其更加符合设计需求。 这个压缩包文件"texiao1891_1560680783"可能包含了实现这个特效的完整代码和资源,你可以解压并研究其中...
3. **动画帧序列**:对于2D动画,可能需要绘制一系列帧来表现气泡的形态变化。从一个小圆点开始,逐渐膨胀成一个完整的气泡形状,然后在达到一定高度后逐渐消散。这种序列可以使用矢量图形软件或像素绘画工具来创建...
在这个“HTML5 Canvas疯狂气泡动画特效特效代码”中,我们将深入探讨如何利用Canvas API来实现一个动态的气泡动画效果,并且介绍如何通过鼠标滚轮来控制动画的行为。 首先,让我们了解一下HTML5 Canvas的基本概念。...
【标题】"纯CSS3创意气泡动画特效.zip"揭示了这个压缩包包含的资源是关于使用纯CSS3实现的一种创新、美观的气泡动画效果。CSS3是层叠样式表(Cascading Style Sheets)的第三版,它极大地扩展了CSS的功能,包括新的...
在这个特效中,开发者首先会创建一系列透明气泡的实例,每个气泡都有自己的位置、大小、速度等属性。这些属性可以通过随机函数生成,以增加视觉的随机性和动态性。例如,可以使用`Math.random()`生成气泡的初始位置...
首先,让我们了解一下Canvas的基本结构。...通过Canvas,开发者可以创建出各种复杂且互动的Web动画,这个全屏彩色气泡特效就是一个生动的例子,展示了HTML5 Canvas在增强用户体验方面的巨大潜力。
Unity3D是一款强大的跨平台游戏开发引擎,以其优秀的3D和2D图形渲染能力、直观的可视化编程界面以及丰富的社区资源而广受开发者喜爱。在游戏制作中,粒子特效是不可或缺的一部分,它们能够极大地增强游戏视觉表现力...
在这个“HTML5 Canvas气泡背景特效”压缩包中,包含了一个使用Canvas技术实现的气泡飘动背景的示例。这个特效可以为网站增添一种轻盈、动态的氛围,尤其适用于营造轻松、活泼的用户体验。 首先,让我们了解一下...
在这款特效中,SVG被用来创建气泡和滑块的图形,通过CSS和JavaScript控制其形状、颜色以及动态行为。 动画部分主要依赖于SVG的`<animate>`元素,它可以为图形的属性设置关键帧动画。在这个例子中,当我们拖动气泡时...
要实现气泡动画特效,我们需要完成以下几个关键步骤: 1. **创建Canvas元素**:在HTML文件中,添加一个`<canvas>`标签,设置其id以便于在JavaScript中引用。 2. **获取Canvas上下文**:在JavaScript中,通过`...