[prev in list] [next in list] [prev in thread] [next in thread] 

List:       openjdk-openjfx-dev
Subject:    Custom Stroke
From:       tamerkarakan () yahoo ! com (Tamer KARAKAN)
Date:       2012-02-27 19:02:46
Message-ID: 1330369366.71258.YahooMailNeo () web126006 ! mail ! ne1 ! yahoo ! com
[Download RAW message or body]

I think JavaFX must support custom stroke style. There is an example do it with a lot \
of hacking. I know some method may change over time.  Technique quite simple. \
AnimationHelper created for support PathAnimation class. It's basicly calculate \
coordinates and rotation from any shape's path over time. We use it in a loop that \
add a shape every next location on shape's path. That shape can be any node. So every \
custom node can be a stroke any shape.



import com.sun.javafx.animation.transition.AnimationPathHelper;
import com.sun.javafx.animation.transition.Position2D;
import com.sun.javafx.geom.Path2D;
import com.sun.javafx.scene.layout.region.ShapeChangeListener;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.control.Button;
import javafx.scene.shape.Shape;

/**
?*
?* @author Tamer KARAKAN
?*/
public class StrokeStyle {

??? private AnimationPathHelper pathHelper;
??? private Shape path;
??? private double frac;
??? private Position2D positionResult;
??? private Group root;
??? private Group strokeShape;

??? public Group getGroup() {
??????? return root;
??? }

??? public void setGroup(Group root) {
??????? this.root = root;
??? }

??? public double getFrac() {
??????? return frac;
??? }

??? public void setFrac(double frac) {
??????? this.frac = frac;
??? }

??? public Shape getPath() {
??????? return path;
??? }

??? public void setPath(Shape path) {
??????? this.path = path;
??? }

??? public StrokeStyle(Shape path, Group group) {
??????? this(path, group, 1.0);


??? }

??? public StrokeStyle(Shape path, Group root, double frac) {
??????? this.path = path;
??????? this.frac = frac;
??????? this.root = root;
??????? 
??????? applyStroke();
??????? path.impl_setShapeChangeListener(new ShapeChangeListener() {

??????????? @Override
??????????? public void changed() {
??????????????? applyStroke();
??????????? }
??????? });
??? }

??? private void applyStroke() {
??????? if (strokeShape != null) {
??????????? root.getChildren().remove(strokeShape);
??????? }
??????? if (strokeShape == null) {
??????????? strokeShape = new Group();
??????? }
??????? if (!strokeShape.getChildren().isEmpty()) {
??????????? strokeShape.getChildren().clear();
??????? }


??????? pathHelper = new AnimationPathHelper(new Path2D(path.impl_configShape()), \
null, .00001);

??????? for (double i = 0.0; i < 1.0; i += frac) {
??????????? positionResult = new Position2D();
??????????? Position2D position2D = pathHelper.getPosition2D(i, true, \
positionResult); ?????????? Shape iterationShape= new Rectangle(10, 5, \
Color.DIMGREY); ?? 


??????????? iterationShape.setRotate(positionResult.rotateAngle);
??????????? iterationShape.setTranslateX(positionResult.x);
??????????? iterationShape.setTranslateY(positionResult.y);

??????????? iterationShape.setMouseTransparent(true);
??????????? strokeShape.getChildren().add(iterationShape);

??????? }

??????? root.getChildren().add(strokeShape);
??? }
}


[prev in list] [next in list] [prev in thread] [next in thread] 

Configure | About | News | Add a list | Sponsored by KoreLogic