@irof Drawing Song by JavaFX
This entry is the translation of 14 Dec. entry of JavaFX Advent Calendar.
Yesterday entry was Trying Groovy's @Vetoable bindings in JavaFX Application by mike_neck.
@irof is a famous blogger in Japan, and irof advent calendar was organized by irof's friends. This entry isn't an entry of irof advent calenar, however I dedicated this entry to irof ;-)
In this entry, I'll show irof icon drawing song. The song is based on Draing irof icon by Canvas of HTML 5 (japanese) by @yukieen.
When drawing icon by JavaFX, we have two choices: one is Shape class, the other is Canvas class. I used Shape in this entry.
At the first, drawing icon border. I used Rectangle class for the border.
Group root = new Group(); // Drawing icon border Rectangle rectangle = new Rectangle(0, 0, 300, 300); rectangle.setStrokeWidth(5.0); rectangle.setStroke(Color.BLACK); rectangle.setFill(Color.WHITE); root.getChildren().add(rectangle);
Next step is outline. Arc class is OK, but I used Path class because I'd like to connect face to mouth lines.
At first I create Path object, then add XXXTo object. XXX is varied. For example, XXX is Move when moving point, and Arc when drawing arc.
It's to be noted that ArcTo class properties are different from Arc class properties. Because of the difference, I wasted time to convert properties values :-(
// Path object for outline Path path = new Path(); path.setStrokeWidth(10.0); path.setStroke(Color.BLACK); // Clipping to fit into icon border path.setClip(new Rectangle(0, 0, 300, 300)); // Start point of outline path.getElements().add(new MoveTo(126.5, 267)); // face line ArcTo arc = new ArcTo(); arc.setX(146); arc.setY(184.5); arc.setRadiusX(117); arc.setRadiusY(117); arc.setLargeArcFlag(true); path.getElements().add(arc);
Then, dwaing mouth. Mouth is constructed by line, so I added LineTo object to Path object. At the end, to close path, I added CloseTo object.
// Lines of mouth path.getElements().add(new LineTo(210, 255)); // Close path path.getElements().add(new ClosePath()); root.getChildren().add(path);
Next is balloon. Balloon is also constrcted by Path class. I use Bézier curve for prickle part.
// Balloon path = new Path(); path.setStrokeWidth(10.0); path.setStroke(Color.BLACK); path.getElements().add(new MoveTo(50, 30)); path.getElements().add(new LineTo(153, 30)); arc = new ArcTo(); arc.setX(153); arc.setY(90); arc.setRadiusX(30); arc.setRadiusY(30); arc.setSweepFlag(true); path.getElements().add(arc); path.getElements().add(new LineTo(105, 90)); // Using Bézier curve for prickle part path.getElements().add(new CubicCurveTo(105, 90, 90, 105, 129, 141)); path.getElements().add(new CubicCurveTo(90, 135, 66, 120, 81, 90)); path.getElements().add(new LineTo(57, 90)); arc = new ArcTo(); arc.setX(50); arc.setY(30); arc.setRadiusX(30); arc.setRadiusY(30); arc.setSweepFlag(true); path.getElements().add(arc); root.getChildren().add(path);
Dots in the balloon are Circle objects.
// Dots in the balloon Circle circle = new Circle(51, 60, 5, Color.BLACK); root.getChildren().add(circle); circle = new Circle(84, 60, 5, Color.BLACK); root.getChildren().add(circle); circle = new Circle(120, 60, 5, Color.BLACK); root.getChildren().add(circle); circle = new Circle(154, 60, 5, Color.BLACK); root.getChildren().add(circle);
At the end, draing eye. Eye is also Circle object.
// Circle circle = new Circle(255, 204, 15); circle.setFill(null); circle.setStroke(Color.BLACK); circle.setStrokeWidth(10); root.getChildren().add(circle);
That's all!
I uploaded source code to gist:github.