如何淡入graphics.fill调用

时间:2013-07-30 08:06:39

标签: java swing awt java-2d

我正在对Canvas对象执行以下操作。

graphics.setColor(BLUE);
graphics.fill(new Rectangle2D.Double(x, y, width, height));

我希望淡化填充色以创建从画布背景颜色到新颜色的平滑过渡(并且可能淡出原来的颜色)。

我玩this kind of thing(将图形对象的复合设置为AlphaComposite,Timer每隔n毫秒更新一次alpha值,但我会闪烁。

我想知道我缺少什么样的概念。

感谢您的任何指示。

2 个答案:

答案 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();
}