java图形-具有两种颜色的形状

java图形-具有两种颜色的形状,java,graphics,Java,Graphics,(这是java)我有一个椭圆形,代表一个单位。我希望椭圆形的颜色代表装置的健康状况。因此,一个完全健康的单元将全部为绿色。随着装置的健康度降低,椭圆形开始从底部填充红色。因此,在50%的生命值下,椭圆形的下半部分是红色的,上半部分是绿色的,当单位死亡时,椭圆形完全是红色的。 我确信这里的解决方案一定是显而易见的,琐碎的,但我就是看不到。 非常感谢您可以在背景中绘制一个红色椭圆形,然后绘制一个椭圆形和矩形的绿色交点,矩形从椭圆形下方开始,然后进一步移动到顶部,以显示下方更多的红色椭圆形 您可能想了

(这是java)我有一个椭圆形,代表一个单位。我希望椭圆形的颜色代表装置的健康状况。因此,一个完全健康的单元将全部为绿色。随着装置的健康度降低,椭圆形开始从底部填充红色。因此,在50%的生命值下,椭圆形的下半部分是红色的,上半部分是绿色的,当单位死亡时,椭圆形完全是红色的。 我确信这里的解决方案一定是显而易见的,琐碎的,但我就是看不到。
非常感谢

您可以在背景中绘制一个红色椭圆形,然后绘制一个椭圆形和矩形的绿色交点,矩形从椭圆形下方开始,然后进一步移动到顶部,以显示下方更多的红色椭圆形


您可能想了解如何使用基本体构建复杂形状

您可以在背景中绘制一个红色椭圆形,然后绘制椭圆形和矩形的绿色交点,其中矩形从椭圆形下方开始,然后进一步移动到顶部,以显示下方的更多红色椭圆形


您可能想了解如何使用基本体构建复杂形状

绘制绿色时,可以在图形上设置剪辑。只有剪辑中的东西才会被画出来

    public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D)g.create();

    g2d.setColor(Color.RED);
    g2d.fillOval(10, 10, 200, 100);

    g2d.setColor(Color.GREEN);
    g2d.setClip(10, 10, 200, 50); 
    g2d.fillOval(10, 10, 200, 100);

}

绘制绿色时,可以在图形上设置剪辑。只有剪辑中的东西才会被画出来

    public void paint(Graphics g) {
    super.paint(g);
    Graphics2D g2d = (Graphics2D)g.create();

    g2d.setColor(Color.RED);
    g2d.fillOval(10, 10, 200, 100);

    g2d.setColor(Color.GREEN);
    g2d.setClip(10, 10, 200, 50); 
    g2d.fillOval(10, 10, 200, 100);

}

重写绘制方法,如下所示:

public void paint(Graphics graphics) 
{    
  super.paint(graphics);

  Rectangle originalClipBounds = graphics.getClipBounds();

  try
  {
    graphics.clipRect(100, 100, 100, 25);
    graphics.setColor(Color.RED);
    graphics.fillOval(100, 100, 100, 100);
  }
  finally
  {
    graphics.setClip(originalClipBounds);
  }

  try
  {
    graphics.clipRect(100, 125, 100, 75);
    graphics.setColor(Color.BLUE);
    graphics.fillOval(100, 100, 100, 100);
  }
  finally
  {
    graphics.setClip(originalClipBounds);
  }
}

可能希望通过一些双缓冲来增强它,但您得到了要点。

覆盖绘制方法,如下所示:

public void paint(Graphics graphics) 
{    
  super.paint(graphics);

  Rectangle originalClipBounds = graphics.getClipBounds();

  try
  {
    graphics.clipRect(100, 100, 100, 25);
    graphics.setColor(Color.RED);
    graphics.fillOval(100, 100, 100, 100);
  }
  finally
  {
    graphics.setClip(originalClipBounds);
  }

  try
  {
    graphics.clipRect(100, 125, 100, 75);
    graphics.setColor(Color.BLUE);
    graphics.fillOval(100, 100, 100, 100);
  }
  finally
  {
    graphics.setClip(originalClipBounds);
  }
}
可能想用一些双缓冲来增强它,但你明白了要点