百度空间 | 百度首页 
 
查看文章
 
转载:JavaSwing也惊艳之一:水晶之恋(一)
2009-02-20 14:10
一、序言

关于“Java做不好桌面”的争论已经由来已久。虽然SwingJava2D已经有超过十年的历史,也有JIDEJGoodiesTWaver等不少开源Swing组件,但是用Java做桌面程序仍然不是一件轻松的事。本《Java也惊艳》系列文章,就是想通过一些简单生动的例子,和大家一起认识Java、探索Swing。其实你只需要多一点创意、多一点耐心,你的Java程序也可以“惊艳”!本文就带您一起进入Java的“水晶之恋”。

二、立体水晶效果

受苹果公司的影响,现在立体水晶风格的界面非常流行。Java也可以吗?我们不妨先尝试一下用Java绘制一个立体水晶风格的按钮到底有多难。一个立体的水晶按钮应当有一个图标、一个圆角矩形区域、边框以及一些立体反光效果,如下图:

简单思路如下:先画矩形区域,然后画图标,然后设置clip并画高亮反光区域,最后画外部边框。

具体实现比较简单,主要代码如下:

Color color = TWaverUtil.getRandomColor();
RoundRectangle2D body
= new RoundRectangle2D.Float(x, y, size, size, size / 3, size / 3
);

//draw body

g2d.setColor(color);
GradientPaint paint
= new
GradientPaint(x,
                     y,
                     color.darker(),
                     x,
                     y
+
size,
                     color.brighter().brighter());
g2d.setPaint(paint);
g2d.fill(body);

//draw image

g2d.setClip(body);
Image image
= TWaverUtil.getImage("/glass/" + i + ".png"
);
g2d.drawImage(image,
                x
+ (size - image.getWidth(null)) / 2
,
                y
+ (size - image.getHeight(null)) / 2
,
               
null
);
g2d.setClip(
null
);

//draw highlight.

Shape highlightArea = createHighlightShape(x, y, size, body);
g2d.setColor(
new Color(255, 255, 255, 150
));
g2d.fill(highlightArea);

//draw outline.

g2d.setColor(color.darkGray);
g2d.draw(body);

其中,对高亮区域的计算,可以用一个圆心在左上方的大圆形和矩形进行剪切:
private static Shape createHighlightShape(int centerX, int centerY, int size, Shape body) {
double myRadius = size * 4
;
  
double x = centerX - size * 2.3
;
  
double y = centerY - size * 3.2
;
   Ellipse2D.Double circle
= new
Ellipse2D.Double(x, y, myRadius, myRadius);
   Area area
= new
Area(circle);
   area.intersect(
new
Area(body));
  
return
area;
}

运行程序效果如下:


三、更多变化

根据上面例子稍作形状变换,可以画出立体水晶球的按钮。
Color color = TWaverUtil.getRandomColor();

Ellipse2D.Double circle
= new Ellipse2D.Double(centerX - radius, centerY - radius, radius * 2, radius * 2
);

//draw body

g2d.setColor(color);
GradientPaint paint
= new GradientPaint(centerX, centerY, color, centerX, centerY + radius * 2
, color.brighter().brighter());
g2d.setPaint(paint);
g2d.fill(circle);

//draw image

g2d.setClip(circle);
Image image
= TWaverUtil.getImage("/glass/" + i + ".png"
);
g2d.drawImage(image,
centerX
- image.getWidth(null) / 2
,
                  centerY
- image.getHeight(null) / 2
,
                 
null
);
g2d.setClip(
null
);

//draw highlight.

Shape highlightArea = createHighlightShape(centerX, centerY, radius);
g2d.setColor(
new Color(255, 255, 255, 150
));
g2d.fill(highlightArea);

唯一略有不同的部分是,水晶球的高亮区域要用两个圆形拼切:

private static Shape createHighlightShape(int centerX, int centerY, int radius) {
double myRadius = radius * 0.8
;
  
double x = centerX -
myRadius;
  
double y1 = centerY - myRadius - myRadius / 5
;
  
double y2 = centerY - myRadius - myRadius / 5 * 2
;

   Ellipse2D.Double circle1
= new Ellipse2D.Double(x, y1, myRadius * 2, myRadius * 2
);
   Ellipse2D.Double circle2
= new Ellipse2D.Double(x, y2, myRadius * 2, myRadius * 2
);

   Area area
= new
Area(circle1);
   area.intersect(
new
Area(circle2));
  
return
area;
}

运行效果如下:


如果再来点儿循环、随机大小、随机位置、随机颜色,就可以做出绚丽的“吹肥皂泡”的效果



类别:it点滴 | 添加到搜藏 | 浏览() | 评论 (0)
 
最近读者:
 
网友评论:
发表评论:
姓 名:
网址或邮箱: (选填)
内 容:
验证码: 请点击后输入四位验证码,字母不区分大小写
      

     

©2009 Baidu