[ https://issues.apache.org/jira/browse/PIVOT-748?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Edgar Merino updated PIVOT-748: ------------------------------- Description: This is a simple, yet useful, Transition which is able to scale the component(s) attached to it for a given period of time, providing a "zoom" effect. ScaleTransition.java import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.apache.pivot.wtk.Component; import org.apache.pivot.wtk.effects.Decorator; import org.apache.pivot.wtk.effects.Transition; import org.apache.pivot.wtk.effects.ScaleDecorator; /** * This transition provides a "zoom" effect for components that use it. * More than one component can be attached to it. * * @author emerino */ public class ScaleTransition extends Transition { private class CustomScaleDecorator extends ScaleDecorator { private float initialScaleX = 1.0f; private float initialScaleY = 1.0f; public void setInitialScales(ScaleDecorator decorator) { initialScaleX = decorator.getScaleX(); initialScaleY = decorator.getScaleY(); } public float getInitialScaleX() { return initialScaleX; } public float getInitialScaleY() { return initialScaleY; } } private static final int DEFAULT_DURATION = 200; private static final int DEFAULT_RATE = 28; private Map<Component, CustomScaleDecorator> componentDecoratorMap = Collections.synchronizedMap(new HashMap<Component, CustomScaleDecorator>()); private boolean reversed; private float scaleFactor = 0.3f; public ScaleTransition() { this(DEFAULT_DURATION, DEFAULT_RATE); } public ScaleTransition(int duration, int rate) { super(duration, rate); } public Set<Component> getComponents() { return componentDecoratorMap.keySet(); } public void addComponent(Component component) { if (component == null) { throw new IllegalArgumentException("Component cannot be null"); } if (!componentDecoratorMap.containsKey(component)) { CustomScaleDecorator scaleDecorator = new CustomScaleDecorator(); for (Decorator decorator : component.getDecorators()) { if (decorator instanceof ScaleDecorator) { scaleDecorator.setInitialScales((ScaleDecorator) decorator); break; } } componentDecoratorMap.put(component, scaleDecorator); component.getDecorators().add(scaleDecorator); } } public void addComponents(Collection<Component> components) { for (Component c : components) { addComponent(c); } } public void setScaleFactor(float zoom) { if (isRunning()) { throw new IllegalStateException("Transition in progress"); } this.scaleFactor = zoom; } public void setReversed(boolean reversed) { if (isRunning()) { throw new IllegalStateException("Transition in progress"); } this.reversed = reversed; } @Override protected void update() { float scaleX = 0; float scaleY = 0; CustomScaleDecorator scaleDecorator = null; for (Component component : componentDecoratorMap.keySet()) { scaleDecorator = componentDecoratorMap.get(component); if (!reversed) { scaleX = scaleDecorator.getInitialScaleX() + (scaleFactor * getPercentComplete()); scaleY = scaleDecorator.getInitialScaleY() + (scaleFactor * getPercentComplete()); } else { scaleX = (scaleDecorator.getInitialScaleX() + scaleFactor) - (scaleFactor * getPercentComplete()); scaleY = (scaleDecorator.getInitialScaleY() + scaleFactor) - (scaleFactor * getPercentComplete()); } scaleDecorator.setScaleX(scaleX); scaleDecorator.setScaleY(scaleY); component.repaint(); } } public void removeComponent(Component component) { if (componentDecoratorMap.containsKey(component)) { component.getDecorators().remove(componentDecoratorMap.remove(component)); componentDecoratorMap.remove(component); } } public void clearComponents() { for (Component c : componentDecoratorMap.keySet()) { removeComponent(c); } } } was: This is a simple, yet useful, Transition which is able to scale the component(s) attached to it for a given period of time, providing a "zoom" effect. ScaleTransition.java import java.util.Collection; import java.util.Collections; import java.util.HashMap; import java.util.Map; import java.util.Set; import org.apache.pivot.wtk.Component; import org.apache.pivot.wtk.effects.Decorator; import org.apache.pivot.wtk.effects.Transition; import org.apache.pivot.wtk.effects.ScaleDecorator; /** * This transition provides a "zoom" effect for components that use it. * More than one component can be attached to it. * * @author emerino */ public class ScaleTransition extends Transition { private class CustomScaleDecorator extends ScaleDecorator { private float initialScaleX = 1.0f; private float initialScaleY = 1.0f; public void setInitialScales(ScaleDecorator decorator) { initialScaleX = decorator.getScaleX(); initialScaleY = decorator.getScaleY(); } public float getInitialScaleX() { return initialScaleX; } public float getInitialScaleY() { return initialScaleY; } } private static final int DEFAULT_DURATION = 200; private static final int DEFAULT_RATE = 28; private Map<Component, CustomScaleDecorator> componentDecoratorMap = Collections.synchronizedMap(new HashMap<Component, CustomScaleDecorator>()); private boolean reversed; private float scaleFactor = 0.3f; public ScaleTransition() { this(DEFAULT_DURATION, DEFAULT_RATE); } public ScaleTransition(int duration, int rate) { super(duration, rate); } public Set<Component> getComponents() { return componentDecoratorMap.keySet(); } public void addComponent(Component component) { if (component == null) { throw new IllegalArgumentException("Component cannot be null"); } if (!componentDecoratorMap.containsKey(component)) { CustomScaleDecorator scaleDecorator = new CustomScaleDecorator(); for (Decorator decorator : component.getDecorators()) { if (decorator instanceof ScaleDecorator) { scaleDecorator.setInitialScales(scaleDecorator); break; } } componentDecoratorMap.put(component, scaleDecorator); component.getDecorators().add(scaleDecorator); } } public void addComponents(Collection<Component> components) { for (Component c : components) { addComponent(c); } } public void setScaleFactor(float zoom) { if (isRunning()) { throw new IllegalStateException("Transition in progress"); } this.scaleFactor = zoom; } public void setReversed(boolean reversed) { if (isRunning()) { throw new IllegalStateException("Transition in progress"); } this.reversed = reversed; } @Override protected void update() { float scaleX = 0; float scaleY = 0; CustomScaleDecorator scaleDecorator = null; for (Component component : componentDecoratorMap.keySet()) { scaleDecorator = componentDecoratorMap.get(component); if (!reversed) { scaleX = scaleDecorator.getInitialScaleX() + (scaleFactor * getPercentComplete()); scaleY = scaleDecorator.getInitialScaleY() + (scaleFactor * getPercentComplete()); } else { scaleX = (scaleDecorator.getInitialScaleX() + scaleFactor) - (scaleFactor * getPercentComplete()); scaleY = (scaleDecorator.getInitialScaleY() + scaleFactor) - (scaleFactor * getPercentComplete()); } scaleDecorator.setScaleX(scaleX); scaleDecorator.setScaleY(scaleY); component.repaint(); } } public void removeComponent(Component component) { if (componentDecoratorMap.containsKey(component)) { component.getDecorators().remove(componentDecoratorMap.remove(component)); componentDecoratorMap.remove(component); } } public void clearComponents() { for (Component c : componentDecoratorMap.keySet()) { removeComponent(c); } } } > ScaleTransition > --------------- > > Key: PIVOT-748 > URL: https://issues.apache.org/jira/browse/PIVOT-748 > Project: Pivot > Issue Type: New Feature > Components: wtk-effects > Reporter: Edgar Merino > > This is a simple, yet useful, Transition which is able to scale the > component(s) attached to it for a given period of time, providing a "zoom" > effect. > ScaleTransition.java > import java.util.Collection; > import java.util.Collections; > import java.util.HashMap; > import java.util.Map; > import java.util.Set; > import org.apache.pivot.wtk.Component; > import org.apache.pivot.wtk.effects.Decorator; > import org.apache.pivot.wtk.effects.Transition; > import org.apache.pivot.wtk.effects.ScaleDecorator; > /** > * This transition provides a "zoom" effect for components that use it. > * More than one component can be attached to it. > * > * @author emerino > */ > public class ScaleTransition extends Transition { > private class CustomScaleDecorator extends ScaleDecorator { > private float initialScaleX = 1.0f; > private float initialScaleY = 1.0f; > public void setInitialScales(ScaleDecorator decorator) { > initialScaleX = decorator.getScaleX(); > initialScaleY = decorator.getScaleY(); > } > public float getInitialScaleX() { > return initialScaleX; > } > public float getInitialScaleY() { > return initialScaleY; > } > } > private static final int DEFAULT_DURATION = 200; > private static final int DEFAULT_RATE = 28; > private Map<Component, CustomScaleDecorator> componentDecoratorMap = > Collections.synchronizedMap(new HashMap<Component, > CustomScaleDecorator>()); > private boolean reversed; > private float scaleFactor = 0.3f; > public ScaleTransition() { > this(DEFAULT_DURATION, DEFAULT_RATE); > } > public ScaleTransition(int duration, int rate) { > super(duration, rate); > } > public Set<Component> getComponents() { > return componentDecoratorMap.keySet(); > } > public void addComponent(Component component) { > if (component == null) { > throw new IllegalArgumentException("Component cannot be null"); > } > if (!componentDecoratorMap.containsKey(component)) { > CustomScaleDecorator scaleDecorator = new CustomScaleDecorator(); > for (Decorator decorator : component.getDecorators()) { > if (decorator instanceof ScaleDecorator) { > scaleDecorator.setInitialScales((ScaleDecorator) > decorator); > break; > } > } > componentDecoratorMap.put(component, scaleDecorator); > component.getDecorators().add(scaleDecorator); > } > } > public void addComponents(Collection<Component> components) { > for (Component c : components) { > addComponent(c); > } > } > public void setScaleFactor(float zoom) { > if (isRunning()) { > throw new IllegalStateException("Transition in progress"); > } > this.scaleFactor = zoom; > } > public void setReversed(boolean reversed) { > if (isRunning()) { > throw new IllegalStateException("Transition in progress"); > } > this.reversed = reversed; > } > @Override > protected void update() { > float scaleX = 0; > float scaleY = 0; > CustomScaleDecorator scaleDecorator = null; > for (Component component : componentDecoratorMap.keySet()) { > scaleDecorator = componentDecoratorMap.get(component); > if (!reversed) { > scaleX = scaleDecorator.getInitialScaleX() + (scaleFactor * > getPercentComplete()); > scaleY = scaleDecorator.getInitialScaleY() + (scaleFactor * > getPercentComplete()); > } else { > scaleX = (scaleDecorator.getInitialScaleX() + scaleFactor) - > (scaleFactor * getPercentComplete()); > scaleY = (scaleDecorator.getInitialScaleY() + scaleFactor) - > (scaleFactor * getPercentComplete()); > } > scaleDecorator.setScaleX(scaleX); > scaleDecorator.setScaleY(scaleY); > component.repaint(); > } > } > public void removeComponent(Component component) { > if (componentDecoratorMap.containsKey(component)) { > > component.getDecorators().remove(componentDecoratorMap.remove(component)); > componentDecoratorMap.remove(component); > } > } > public void clearComponents() { > for (Component c : componentDecoratorMap.keySet()) { > removeComponent(c); > } > } > } -- This message is automatically generated by JIRA. For more information on JIRA, see: http://www.atlassian.com/software/jira