我正在对Canvas
对象执行以下操作。
graphics.setColor(BLUE);
graphics.fill(new Rectangle2D.Double(x, y, width, height));
我希望淡化填充色以创建从画布背景颜色到新颜色的平滑过渡(并且可能淡出原来的颜色)。
我玩this kind of thing(将图形对象的复合设置为AlphaComposite,Timer
每隔n毫秒更新一次alpha
值,但我会闪烁。
我想知道我缺少什么样的概念。
感谢您的任何指示。
答案 0 :(得分:1)
首先,你怎么能使用AWT?它已经过时了。我建议你切换到挥杆,主要是因为挥杆有双缓冲,这会消除你的闪烁。
答案 1 :(得分:0)
您的应用程序完全按照您的要求执行操作。如果你想制作淡入效果,你必须确定你想要做什么样的颜色变化,创建一个能够做到这一点的函数,并实现淡入淡出。
我会这样做:
class FadeEffect{
int totalDurationMs;
int elapsedDurationMs;
Color initialColor;
Color finalColor;
Color getColor(int durationDelta) {
elapsedDurationMs += durationDelta;
if (elapsedDurationMs > totalDurationMs) {
return finalColor;
}
double progress = 1.0d*elapsedDurationMs/totalDurationMs;
return new Color( (int)(finalColor.getRed()-initialColor.getRed())*progress,
(int)(finalColor.getGreen()-initialColor.getGreen())*progress,
(int)(finalColor.getBlue()-initialColor.getBlue())*progress);
}
//getters, setters, etc
}
关于闪烁问题:确保使用双缓冲 - 在组件中,或通过手动绘制屏幕外缓冲区(图像)并仅在绘图完成时将图像发布到屏幕上。 / p>
以下是我的Graphic2D应用程序执行双缓冲的示例代码:
private VolatileImage vImg;
@Override
public void paint(Graphics g) {
if (gc==null) gc = this.getGraphicsConfiguration();
do {
boolean sizeChanged = false;
sizeChanged = (vImg!=null&&(vImg.getWidth()!=getWidth()|| vImg.getHeight()!=getHeight()));
if (vImg == null || vImg.validate(gc) == VolatileImage.IMAGE_INCOMPATIBLE
|| sizeChanged) {
vImg = gc.createCompatibleVolatileImage(getWidth(), getHeight());
vImg.setAccelerationPriority(1);
}
final Graphics gimg = vImg.getGraphics();
if (gimg instanceof Graphics2D) {
renderContents((Graphics2D) gimg);
gimg.dispose();
g.drawImage(vImg, 0, 0, null);
} else {
throw new UnsupportedOperationException("Rendering impossible, graphics are not of Graphics2D class");
}
} while (vImg.contentsLost());
updateAnimationNo();
}