快速业务通道

Java 2D开发技巧之“灯光与阴影” - 编程入门网

作者 佚名技术 来源 NET编程 浏览 发布时间 2012-06-21
:为了实现发光效果,我们开始使用一种"内部"颜色粗笔 //和笔划需要的形状。然后,我们不断地把笔变细, //并且不断地移向"外部"颜色, //并且不断地提高颜色的不透明度以便使其朝向形状的内部看上去暗淡。 //我们使用已经生成到我们的目的图像上的"修剪形状",这样以来, //SRC_ATOP规则就会修剪在我们的形状外部的笔划部分。 private void paintBorderGlow(Graphics2D g2, int glowWidth) {   int gw = glowWidth*2;   for (int i=gw; i >= 2; i-=2) {    float pct = (float)(gw - i) / (gw - 1);    Color mixHi = getMixedColor(clrGlowInnerHi, pct,clrGlowOuterHi, 1.0f - pct);    Color mixLo = getMixedColor(clrGlowInnerLo, pct,clrGlowOuterLo, 1.0f - pct);    g2.setPaint(new GradientPaint(0.0f, height*0.25f, mixHi,0.0f, height, mixLo));    //g2.setColor(Color.WHITE);    g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, pct));    g2.setStroke(new BasicStroke(i));    g2.draw(clipShape);   } } Shape clipShape = createClipShape(); //Shape clipShape = new Ellipse2D.Float(width/4, height/4, width/2, height/2); //把背景清除为白色 g.setColor(Color.WHITE); g.fillRect(0, 0, width, height); //设置修剪形状 BufferedImage clipImage = createClipImage(clipShape); Graphics2D g2 = clipImage.createGraphics(); //使用渐变填充形状 g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); g2.setComposite(AlphaComposite.SrcAtop); g2.setPaint(new GradientPaint(0, 0, clrHi, 0, height, clrLo)); g2.fill(clipShape); //应用边界发光效果 paintBorderGlow(g2, 8); g2.dispose(); g.drawImage(clipImage, 0, 0, null);

Java 2D开发技巧之“灯光与阴影”(2)

时间:2011-01-05 天极 朱先忠

注意,在上面的例子中,我把一些可选的代码行加上了注释。你可以去掉这些注释并观察它们对生成效果的影响。

注意:聪明的读者可以已经注意到,上面应用于paintBorderGlow()方法中的技术也可以用于沿形状添加一种投影效果。你不妨先猜测一下如何实现这一点……好,时间到!不是在形状的顶部生成边缘(记住,修剪能够确保笔划仅影响形状的内部),我们可以预先绕着我们的形状生成一种可变的灰色边界。这意味着,阴影笔划将出现在我们的形状的外边;阴影笔划的内部将会通过我们的形状而有效地生成。

你可以把下面的一些代码插入到上面的例子中以便在相应的同一个形状上添加一种阴影边界效果:

private void paintBorderShadow(Graphics2D g2, int shadowWidth) {   g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING,RenderingHints.VALUE_ANTIALIAS_ON);   int sw = shadowWidth*2;   for (int i=sw; i >= 2; i-=2) {    float pct = (float)(sw - i) / (sw - 1);    g2.setColor(getMixedColor(Color.LIGHT_GRAY, pct,Color.WHITE, 1.0f-pct));    g2.setStroke(new BasicStroke(i));    g2.draw(clipShape);   } } //在我们绘制形状的其它部分前应用边界的阴影效果。 paintBorderShadow(g, 6);

下面图2是最终的结果图像:

Java 2D开发技巧之“灯光与阴影” - 编程入门网

图2.施加Java 2D效果后的最终结果形状

三、小结

在本文中,我仅向你介绍了快速地添加一种阴影效果的方法。如果有时间的话,我很可能会使用一种亮灰色和一种非线性斜面来实现一种更为真实的效果。还要注意的是,这里介绍的仅是使用Java 2D实现投影效果的许多方法之一。注意,Romain在他的博客中已经讨论了多

凌众科技专业提供服务器租用、服务器托管、企业邮局、虚拟主机等服务,公司网站:http://www.lingzhong.cn 为了给广大客户了解更多的技术信息,本技术文章收集来源于网络,凌众科技尊重文章作者的版权,如果有涉及你的版权有必要删除你的文章,请和我们联系。以上信息与文章正文是不可分割的一部分,如果您要转载本文章,请保留以上信息,谢谢!

分享到: 更多

Copyright ©1999-2011 厦门凌众科技有限公司 厦门优通互联科技开发有限公司 All rights reserved

地址(ADD):厦门软件园二期望海路63号701E(东南融通旁) 邮编(ZIP):361008

电话:0592-5908028 传真:0592-5908039 咨询信箱:web@lingzhong.cn 咨询OICQ:173723134

《中华人民共和国增值电信业务经营许可证》闽B2-20100024  ICP备案:闽ICP备05037997号