Pivot nicely provides a few
nice effects for items. This is useful for images, etc but if you want to make a simple text-based header it needs the tiniest bit of tweaking.
<Label text="Your Title" styles="{font:'Arial bold 36',color:'#a0a0a0'}">
<decorators>
<effects:Reflection/>
</decorators>
</Label>
What we need is to translate the reflection so it overlaps the text a little.
<Label text="Your Title" styles="{font:'Arial bold 36',color:'#a0a0a0'}">
<decorators>
<myeffects:ConfigurableReflection yTranslate="-20"/>
</decorators>
</Label>
We can just modify the Reflection effect and two properties for x & y reflection translation and tweak where the reflection is drawn. Here's the modified ConfigurableReflection class
public class ConfigurableReflection extends ReflectionDecorator {
private Component component = null;
private Graphics2D graphics = null;
private BufferedImage componentImage = null;
private Graphics2D componentImageGraphics = null;
private int yTranslate = 0;
private int xTranslate = 0;
public void setXTranslate(int xTranslate) {
this.xTranslate = xTranslate;
}
public void setYTranslate(int yTranslate) {
this.yTranslate = yTranslate;
}
public int getXTranslate() {
return xTranslate;
}
public int getYTranslate() {
return yTranslate;
}
@Override
public Graphics2D prepare(Component component, Graphics2D graphics) {
this.component = component;
this.graphics = graphics;
int width = component.getWidth();
int height = component.getHeight();
componentImage = new BufferedImage(width, height, BufferedImage.TYPE_INT_ARGB);
componentImageGraphics = componentImage.createGraphics();
// Clear the image background
componentImageGraphics.setComposite(AlphaComposite.Clear);
componentImageGraphics.fillRect(0, 0, componentImage.getWidth(), componentImage.getHeight());
componentImageGraphics.setComposite(AlphaComposite.SrcOver);
return componentImageGraphics;
}
@Override
public void update() {
// Draw the component
graphics.drawImage(componentImage, 0, 0, null);
// Draw the reflection
int width = componentImage.getWidth();
int height = componentImage.getHeight();
GradientPaint mask = new GradientPaint(0, height / 4f, new Color(1.0f, 1.0f, 1.0f, 0.0f),
0, height, new Color(1.0f, 1.0f, 1.0f, 0.5f));
componentImageGraphics.setPaint(mask);
componentImageGraphics.setComposite(AlphaComposite.DstIn);
componentImageGraphics.fillRect(0, 0, width, height);
componentImageGraphics.dispose();
componentImageGraphics = null;
componentImage.flush();
graphics.transform(getTransform(component));
graphics.drawImage(componentImage, 0, 0, null);
componentImage = null;
component = null;
graphics = null;
}
@Override
public Bounds getBounds(Component component) {
// MODIFICATION for new translation
return new Bounds(0, 0, component.getWidth() + xTranslate, component.getHeight() * 2 + yTranslate);
}
@Override
public AffineTransform getTransform(Component component) {
AffineTransform transform = AffineTransform.getScaleInstance(1.0, -1.0);
// MODIFICATION for new translation
transform.translate(xTranslate, -((component.getHeight() * 2) + yTranslate));
return transform;
}
}