下面列出了怎么用javafx.scene.paint.RadialGradient的API类实例代码及写法,或者点击链接到github查看源代码。
public RadialGradientSample() {
//create simple radial gradient
RadialGradient gradient1 = new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.NO_CYCLE, new Stop[] {
new Stop(0, Color.DODGERBLUE),
new Stop(1, Color.BLACK)
});
Circle circle1 = new Circle(45, 45, 40, gradient1);
//create complex radial gradient
RadialGradient gradient2 = new RadialGradient(20, 1, 0.5, 0.5, 0.6, true, CycleMethod.NO_CYCLE, new Stop[] {
new Stop(0, Color.TRANSPARENT),
new Stop(0.5, Color.DARKGRAY),
new Stop(0.64, Color.WHITESMOKE),
new Stop(0.65, Color.YELLOW),
new Stop(1, Color.GOLD)
});
Circle circle2 = new Circle(145, 45, 40, gradient2);
HBox hb = new HBox(10);
hb.getChildren().addAll(circle1, circle2);
// show the circles
getChildren().addAll(hb);
}
public RadialGradientSample() {
//create simple radial gradient
RadialGradient gradient1 = new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.NO_CYCLE, new Stop[] {
new Stop(0, Color.DODGERBLUE),
new Stop(1, Color.BLACK)
});
Circle circle1 = new Circle(45, 45, 40, gradient1);
//create complex radial gradient
RadialGradient gradient2 = new RadialGradient(20, 1, 0.5, 0.5, 0.6, true, CycleMethod.NO_CYCLE, new Stop[] {
new Stop(0, Color.TRANSPARENT),
new Stop(0.5, Color.DARKGRAY),
new Stop(0.64, Color.WHITESMOKE),
new Stop(0.65, Color.YELLOW),
new Stop(1, Color.GOLD)
});
Circle circle2 = new Circle(145, 45, 40, gradient2);
HBox hb = new HBox(10);
hb.getChildren().addAll(circle1, circle2);
// show the circles
getChildren().addAll(hb);
}
private void draw(final int LIMIT, final double RESOLUTION) {
int limit = LIMIT > points.size() ? points.size() : LIMIT + 1;
double pixelSize = 2 * RESOLUTION;
ctx.clearRect(0, 0, width, height);
for (double y = 0 ; y < height ; y += RESOLUTION) {
for (double x = 0 ; x < width ; x += RESOLUTION) {
double value = getValueAt(limit, x, y);
if (value != -255) {
Color color = getUseColorMapping() ? getColorForValue(value) : getColorForValue(value, isDiscreteColors());
RadialGradient gradient = new RadialGradient(0, 0, x, y, RESOLUTION,
false, CycleMethod.NO_CYCLE,
new Stop(0, Color.color(color.getRed(), color.getGreen(), color.getBlue(), getHeatMapOpacity())),
new Stop(1, Color.color(color.getRed(), color.getGreen(), color.getBlue(), 0.0)));
ctx.setFill(gradient);
ctx.fillOval(x - RESOLUTION, y - RESOLUTION, pixelSize, pixelSize);
}
}
}
}
protected void drawLeftImage() {
AnchorPane pane = new AnchorPane();
pane.setPrefWidth(187);
Stop[] stops = new Stop[] { new Stop(0, Color.web("#3c79b2")), new Stop(1, Color.web("#2d5d8b")) };
RadialGradient gradient = new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.NO_CYCLE, stops);
Background background = new Background(new BackgroundFill(gradient, null, null));
pane.setBackground(background);
Text text = new Text(this.parent.getLeftImageText());
text.setFill(Color.WHITE);
text.setFont(Font.font("Maven Pro", 50));
text.setRotate(-90);
pane.setPadding(new Insets(-50));
pane.getChildren().add(text);
AnchorPane.setBottomAnchor(text, 160.0);
AnchorPane.setRightAnchor(text, -40.0);
getParent().getRoot().setLeft(pane);
}
public void addMenuItem(final String iconPath,
final EventHandler<MouseEvent> eventHandler) {
final RadialGradient backGradient = new RadialGradient(0, 0, 0, 0,
radius.get(), false, CycleMethod.NO_CYCLE, new Stop(0,
BACK_GRADIENT_COLOR), new Stop(1, Color.TRANSPARENT));
final RadialGradient backSelectGradient = new RadialGradient(0, 0, 0,
0, radius.get(), false, CycleMethod.NO_CYCLE, new Stop(0,
BACK_SELECT_GRADIENT_COLOR), new Stop(1,
Color.TRANSPARENT));
final RadialMenuItem item = RadialMenuItemBuilder.create()
.length(length).graphic(new Group(getImageView(iconPath)))
.backgroundFill(backGradient)
.backgroundMouseOnFill(backSelectGradient)
.innerRadius(innerRadius).radius(radius).offset(offset)
.clockwise(true).backgroundVisible(true).strokeVisible(false)
.build();
item.setOnMouseClicked(eventHandler);
items.add(item);
itemsContainer.getChildren().addAll(item);
}
public static Node createIconContent() {
Rectangle rect = new Rectangle(80,80,new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.NO_CYCLE, new Stop[] {
new Stop(0, Color.rgb(156,216,255)),
new Stop(0.5, Color.DODGERBLUE),
new Stop(1, Color.rgb(0,70,140))
}));
rect.setArcWidth(20);
rect.setArcHeight(20);
return rect;
}
public static Node createIconContent() {
Rectangle rect = new Rectangle(80,80,new RadialGradient(0, 0, 0.5, 0.5, 1, true, CycleMethod.NO_CYCLE, new Stop[] {
new Stop(0, Color.rgb(156,216,255)),
new Stop(0.5, Color.DODGERBLUE),
new Stop(1, Color.rgb(0,70,140))
}));
rect.setArcWidth(20);
rect.setArcHeight(20);
return rect;
}
public void setFill(Color color)
{
ellipse.setFill(
new RadialGradient(0, 0, 0.3, 0.1, 0.4, true, CycleMethod.NO_CYCLE,
new Stop(0, color.interpolate(Color.WHITESMOKE, 0.8)),
new Stop(1, color)));
fill.setFill(new LinearGradient(0, 0, .8, 0, true, CycleMethod.NO_CYCLE,
new Stop(0, color),
new Stop(.3, color.interpolate(Color.WHITESMOKE, 0.7)),
new Stop(1, color)));
}
public void setFill(Color color)
{
ellipse.setFill(
new RadialGradient(0, 0, 0.3, 0.1, 0.4, true, CycleMethod.NO_CYCLE,
new Stop(0, color.interpolate(Color.WHITESMOKE, 0.8)),
new Stop(1, color)));
fill.setFill(new LinearGradient(0, 0, .8, 0, true, CycleMethod.NO_CYCLE,
new Stop(0, color),
new Stop(.3, color.interpolate(Color.WHITESMOKE, 0.7)),
new Stop(1, color)));
}
@Override public void init() {
List<YChartItem> item1 = new ArrayList<>(ELEMENTS);
List<YChartItem> item2 = new ArrayList<>(ELEMENTS);
List<YChartItem> item3 = new ArrayList<>(ELEMENTS);
for (int i = 0 ; i < ELEMENTS ; i++) {
YChartItem dataPoint;
dataPoint = new YChartItem(RND.nextDouble() * 100, "P" + i);
item1.add(dataPoint);
dataPoint = new YChartItem(RND.nextDouble() * 100, "P" + i);
item2.add(dataPoint);
dataPoint = new YChartItem(RND.nextDouble() * 100, "P" + i);
item3.add(dataPoint);
}
series1 = new YSeries(item3, CHART_TYPE, new RadialGradient(0, 0, 0, 0, 1, true, CycleMethod.NO_CYCLE, new Stop(0.0, Color.rgb(0, 255, 255, 0.25)), new Stop(0.5, Color.rgb(255, 255, 0, 0.5)), new Stop(1.0, Color.rgb(255, 0, 255, 0.75))), Color.TRANSPARENT);
series2 = new YSeries(item1, CHART_TYPE, new RadialGradient(0, 0, 0, 0, 1, true, CycleMethod.NO_CYCLE, new Stop(0.0, Color.rgb(255, 0, 0, 0.25)), new Stop(0.5, Color.rgb(255, 255, 0, 0.5)), new Stop(1.0, Color.rgb(0, 200, 0, 0.75))), Color.TRANSPARENT);
series3 = new YSeries(item2, CHART_TYPE, new RadialGradient(0, 0, 0, 0, 1, true, CycleMethod.NO_CYCLE, new Stop(0.0, Color.rgb(0, 255, 255, 0.25)), new Stop(0.5, Color.rgb(0, 255, 255, 0.5)), new Stop(1.0, Color.rgb(0, 0, 255, 0.75))), Color.TRANSPARENT);
series2.setWithWrapping(true);
chart = new YChart(new YPane(series1, series2, series3));
chart.setPrefSize(600, 600);
timeline = new Timeline();
lastTimerCall = System.nanoTime();
timer = new AnimationTimer() {
@Override public void handle(final long now) {
if (now > lastTimerCall + INTERVAL) {
animateData();
long delta = System.nanoTime() - now;
timeline.play();
lastTimerCall = now + delta;
}
}
};
registerListener();
}
private void updateGradient() {
gradient = new RadialGradient(0, 0,
offsetX + width * centerX, offsetY + height * centerY, 1024,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, getColorWithOpacity(getAlpha())),
new Stop(1.0, Color.TRANSPARENT));
}
private static Paint resolvePaintValue(String iconCode, String value) {
try { return Color.valueOf(value); } catch (IllegalArgumentException e1) {
try { return LinearGradient.valueOf(value); } catch (IllegalArgumentException e2) {
try { return RadialGradient.valueOf(value); } catch (IllegalArgumentException e3) {
throw invalidDescription(iconCode, e3);
}
}
}
}
private static Paint resolvePaintValue(String iconCode, String value) {
try { return Color.valueOf(value); } catch (IllegalArgumentException e1) {
try { return LinearGradient.valueOf(value); } catch (IllegalArgumentException e2) {
try { return RadialGradient.valueOf(value); } catch (IllegalArgumentException e3) {
throw invalidDescription(iconCode, e3);
}
}
}
}
private void recalc() {
double size = getWidth() < getHeight() ? getWidth() : getHeight();
ledOffShadow = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(0, 0, 0, 0.65), 0.07 * size, 0, 0, 0);
ledOnShadow = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(0, 0, 0, 0.65), 0.07 * size, 0, 0, 0);
ledOnShadow.setInput(new DropShadow(BlurType.TWO_PASS_BOX, ledColor.get(), 0.36 * size, 0, 0, 0));
frameGradient = new LinearGradient(0.14 * size, 0.14 * size,
0.84 * size, 0.84 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.rgb(20, 20, 20, 0.65)),
new Stop(0.15, Color.rgb(20, 20, 20, 0.65)),
new Stop(0.26, Color.rgb(41, 41, 41, 0.65)),
new Stop(0.26, Color.rgb(41, 41, 41, 0.64)),
new Stop(0.85, Color.rgb(200, 200, 200, 0.41)),
new Stop(1.0, Color.rgb(200, 200, 200, 0.35)));
ledOnGradient = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, ledColor.get().deriveColor(0d, 1d, 0.77, 1d)),
new Stop(0.49, ledColor.get().deriveColor(0d, 1d, 0.5, 1d)),
new Stop(1.0, ledColor.get()));
ledOffGradient = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, ledColor.get().deriveColor(0d, 1d, 0.20, 1d)),
new Stop(0.49, ledColor.get().deriveColor(0d, 1d, 0.13, 1d)),
new Stop(1.0, ledColor.get().deriveColor(0d, 1d, 0.2, 1d)));
highlightGradient = new RadialGradient(0, 0,
0.3 * size, 0.3 * size,
0.29 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.WHITE),
new Stop(1.0, Color.TRANSPARENT));
draw();
}
private void computeBack() {
final Rectangle rect = new Rectangle();
rect.setWidth(widthProp.get());
rect.setHeight(heightProp.get());
rect.setTranslateX(widthProp.get() / -2.0);
rect.setTranslateY(heightProp.get() / -2.0);
final RadialGradient radialGradient = new RadialGradient(0, 0,
widthProp.get() / 2.0, heightProp.get() / 2.0,
widthProp.get() / 2.0, false, CycleMethod.NO_CYCLE, new Stop(0,
Color.TRANSPARENT), new Stop(1, BACK_GRADIENT_COLOR));
rect.setFill(radialGradient);
backContainer.getChildren().setAll(rect);
}
@Override public void init() {
List<XYChartItem> xyItem1 = new ArrayList<>(NO_OF_X_VALUES);
List<XYChartItem> xyItem2 = new ArrayList<>(NO_OF_X_VALUES);
List<XYChartItem> xyItem3 = new ArrayList<>(NO_OF_X_VALUES);
List<XYChartItem> xyItem4 = new ArrayList<>(NO_OF_X_VALUES);
for (int i = 0 ; i < NO_OF_X_VALUES ; i++) {
xyItem1.add(new XYChartItem(i, RND.nextDouble() * 12 + RND.nextDouble() * 6, "P" + i, COLORS[RND.nextInt(3)]));
xyItem2.add(new XYChartItem(i, RND.nextDouble() * 7 + RND.nextDouble() * 3, "P" + i, COLORS[RND.nextInt(3)]));
xyItem3.add(new XYChartItem(i, RND.nextDouble() * 3 + RND.nextDouble() * 4, "P" + i, COLORS[RND.nextInt(3)]));
xyItem4.add(new XYChartItem(i, RND.nextDouble() * 4, "P" + i, COLORS[RND.nextInt(3)]));
}
xySeries1 = new XYSeries(xyItem1, ChartType.LINE, Color.rgb(255, 0, 0, 0.5), Color.RED);
xySeries2 = new XYSeries(xyItem2, ChartType.LINE, Color.rgb(0, 255, 0, 0.5), Color.LIME);
xySeries3 = new XYSeries(xyItem3, ChartType.LINE, Color.rgb(0, 0, 255, 0.5), Color.BLUE);
xySeries4 = new XYSeries(xyItem4, ChartType.LINE, Color.rgb(255, 0, 255, 0.5), Color.MAGENTA);
xySeries1.setSymbolsVisible(false);
xySeries2.setSymbolsVisible(false);
xySeries3.setSymbolsVisible(false);
xySeries4.setSymbolsVisible(false);
// XYChart
Converter tempConverter = new Converter(TEMPERATURE, CELSIUS); // Type Temperature with BaseUnit Celsius
double tempFahrenheitMin = tempConverter.convert(0, FAHRENHEIT);
double tempFahrenheitMax = tempConverter.convert(20, FAHRENHEIT);
lineChartXAxisBottom = createBottomXAxis(0, NO_OF_X_VALUES, true);
lineChartYAxisLeft = createLeftYAxis(0, 20, true);
lineChartYAxisRight = createRightYAxis(tempFahrenheitMin, tempFahrenheitMax, false);
xyChart = new XYChart<>(new XYPane(xySeries1, xySeries2, xySeries3, xySeries4),
lineChartYAxisLeft, lineChartYAxisRight, lineChartXAxisBottom);
// YChart
List<YChartItem> yItem1 = new ArrayList<>(20);
List<YChartItem> yItem2 = new ArrayList<>(20);
List<YChartItem> yItem3 = new ArrayList<>(20);
for (int i = 0 ; i < 20 ; i++) {
yItem1.add(new YChartItem(RND.nextDouble() * 100, "P" + i, COLORS[RND.nextInt(3)]));
yItem2.add(new YChartItem(RND.nextDouble() * 100, "P" + i, COLORS[RND.nextInt(3)]));
yItem3.add(new YChartItem(RND.nextDouble() * 100, "P" + i, COLORS[RND.nextInt(3)]));
}
ySeries1 = new YSeries(yItem1, ChartType.RADAR_SECTOR, new RadialGradient(0, 0, 0, 0, 1, true, CycleMethod.NO_CYCLE, new Stop(0.0, Color.rgb(255, 0, 0, 0.5)), new Stop(0.5, Color.rgb(255, 255, 0, 0.5)), new Stop(1.0, Color.rgb(0, 200, 0, 0.8))), Color.TRANSPARENT);
ySeries2 = new YSeries(yItem2, ChartType.SMOOTH_RADAR_POLYGON, new RadialGradient(0, 0, 0, 0, 1, true, CycleMethod.NO_CYCLE, new Stop(0.0, Color.rgb(0, 255, 255, 0.5)), new Stop(1.0, Color.rgb(0, 0, 255, 0.5))), Color.TRANSPARENT);
ySeries3 = new YSeries(yItem3, ChartType.SMOOTH_RADAR_POLYGON, new RadialGradient(0, 0, 0, 0, 1, true, CycleMethod.NO_CYCLE, new Stop(0.0, Color.rgb(255, 255, 0, 0.5)), new Stop(1.0, Color.rgb(255, 0, 255, 0.5))), Color.TRANSPARENT);
yChart = new YChart(new YPane(ySeries1, ySeries2, ySeries3));
lastTimerCall = System.nanoTime();
timer = new AnimationTimer() {
@Override public void handle(final long now) {
if (now > lastTimerCall + UPDATE_INTERVAL) {
ObservableList<XYChartItem> xyItems = xySeries1.getItems();
xyItems.forEach(item -> item.setY(RND.nextDouble() * 8 + RND.nextDouble() * 10));
xyItems = xySeries2.getItems();
xyItems.forEach(item -> item.setY(RND.nextDouble() * 4 + RND.nextDouble() * 10));
xyItems = xySeries3.getItems();
xyItems.forEach(item -> item.setY(RND.nextDouble() * 3 + RND.nextDouble() * 4));
xyItems = xySeries4.getItems();
xyItems.forEach(item -> item.setY(RND.nextDouble() * 4));
ObservableList<YChartItem> yItems = ySeries1.getItems();
yItems.forEach(item -> item.setY(RND.nextDouble() * 100));
yItems = ySeries2.getItems();
yItems.forEach(item -> item.setY(RND.nextDouble() * 100));
yItems = ySeries3.getItems();
yItems.forEach(item -> item.setY(RND.nextDouble() * 100));
// Can be used to update charts but if more than one series is in one xyPane
// it's easier to use the refresh() method of XYChart
//xySeries1.refresh();
//xySeries2.refresh();
//xySeries3.refresh();
//xySeries4.refresh();
// Useful to refresh the chart if it contains more than one series to avoid
// multiple redraws
xyChart.refresh();
//ySeries1.refresh();
//ySeries2.refresh();
yChart.refresh();
lastTimerCall = now;
}
}
};
}
@Override protected void redraw() {
pane.setBorder(new Border(new BorderStroke(clock.getBorderPaint(), BorderStrokeStyle.SOLID, CornerRadii.EMPTY, new BorderWidths(clock.getBorderWidth() / PREFERRED_WIDTH * height))));
pane.setBackground(new Background(new BackgroundFill(clock.getBackgroundPaint(), CornerRadii.EMPTY, Insets.EMPTY)));
hourColor = clock.getHourColor();
hourOffColor = Helper.getTranslucentColorFrom(hourColor, 0.15);
minuteColor = clock.getMinuteColor();
minuteOffColor = Helper.getTranslucentColorFrom(minuteColor, 0.15);
secondColor = clock.getSecondColor();
secondOffColor = Helper.getTranslucentColorFrom(secondColor, 0.15);
hourGradient = new RadialGradient(0, 0,
0.5, 0.5, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.00, hourColor),
new Stop(0.25, hourColor),
new Stop(0.43, hourColor.darker()),
new Stop(0.48, hourColor.darker().darker().darker()),
new Stop(0.50, hourColor.darker().darker().darker().darker()));
hourOffGradient = new RadialGradient(0, 0,
0.5, 0.5, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.00, hourOffColor),
new Stop(0.25, hourOffColor),
new Stop(0.43, hourOffColor.darker()),
new Stop(0.48, hourOffColor.darker().darker().darker()),
new Stop(0.50, hourOffColor.darker().darker().darker().darker()));
minuteGradient = new RadialGradient(0, 0,
0.5, 0.5, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.00, minuteColor),
new Stop(0.25, minuteColor),
new Stop(0.43, minuteColor.darker()),
new Stop(0.48, minuteColor.darker().darker().darker()),
new Stop(0.50, minuteColor.darker().darker().darker().darker()));
minuteOffGradient = new RadialGradient(0, 0,
0.5, 0.5, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.00, minuteOffColor),
new Stop(0.25, minuteOffColor),
new Stop(0.43, minuteOffColor.darker()),
new Stop(0.48, minuteOffColor.darker().darker().darker()),
new Stop(0.50, minuteOffColor.darker().darker().darker().darker()));
secondGradient = new RadialGradient(0, 0,
0.5, 0.5, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.00, secondColor),
new Stop(0.25, secondColor),
new Stop(0.43, secondColor.darker()),
new Stop(0.48, secondColor.darker().darker().darker()),
new Stop(0.50, secondColor.darker().darker().darker().darker()));
secondOffGradient = new RadialGradient(0, 0,
0.5, 0.5, 1,
true, CycleMethod.NO_CYCLE,
new Stop(0.00, secondOffColor),
new Stop(0.25, secondOffColor),
new Stop(0.43, secondOffColor.darker()),
new Stop(0.48, secondOffColor.darker().darker().darker()),
new Stop(0.50, secondOffColor.darker().darker().darker().darker()));
drawTime();
}
@Override protected void redraw() {
pane.setBorder(new Border(new BorderStroke(clock.getBorderPaint(), BorderStrokeStyle.SOLID, new CornerRadii(1024), new BorderWidths(clock.getBorderWidth() / PREFERRED_WIDTH * size))));
pane.setBackground(new Background(new BackgroundFill(clock.getBackgroundPaint(), new CornerRadii(1024), Insets.EMPTY)));
hour.setFill(clock.getHourColor());
minute.setFill(clock.getMinuteColor());
second.setFill(clock.getSecondColor());
knob.setFill(clock.getKnobColor());
title.setFill(clock.getTitleColor());
text.setFill(clock.getTextColor());
shadowGroupHour.setEffect(clock.getShadowsEnabled() ? dropShadow : null);
shadowGroupMinute.setEffect(clock.getShadowsEnabled() ? dropShadow : null);
shadowGroupSecond.setEffect(clock.getShadowsEnabled() ? dropShadow : null);
// Areas, Sections
sectionsAndAreasCtx.clearRect(0, 0, size, size);
if (areasVisible) Helper.drawTimeAreas(clock, sectionsAndAreasCtx, areas, size, 0.025, 0.025, 0.95, 0.95);
if (sectionsVisible) Helper.drawTimeSections(clock, sectionsAndAreasCtx, sections, size, 0.06, 0.06, 0.88, 0.88, 0.07);
// Tick Marks
tickCanvas.setCache(false);
drawTicks();
tickCanvas.setCache(true);
tickCanvas.setCacheHint(CacheHint.QUALITY);
ZonedDateTime time = clock.getTime();
updateTime(time);
title.setText(clock.getTitle());
Helper.adjustTextSize(title, 0.6 * size, size * 0.12);
title.relocate((size - title.getLayoutBounds().getWidth()) * 0.5, size * 0.25);
text.setText(TIME_FORMATTER.format(time));
Helper.adjustTextSize(text, 0.6 * size, size * 0.12);
text.relocate((size - text.getLayoutBounds().getWidth()) * 0.5, size * 0.6);
dateNumber.setText(DATE_NUMBER_FORMATER.format(time).toUpperCase());
Helper.adjustTextSize(dateNumber, 0.3 * size, size * 0.05);
dateNumber.relocate(((size * 0.5) - dateNumber.getLayoutBounds().getWidth()) * 0.5 + (size * 0.6), (size - dateNumber.getLayoutBounds().getHeight()) * 0.5);
knob.setFill(new RadialGradient(0, 0, size * 0.5, size * 0.5, size * 0.0148448,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.rgb(1, 2, 1)),
new Stop(0.4, Color.rgb(15, 15, 15)),
new Stop(0.6, Color.rgb(153, 153, 153)),
new Stop(0.8, Color.rgb(27, 10, 27)),
new Stop(1.0, Color.rgb(27, 10, 27))));
alarmPane.getChildren().setAll(alarmMap.values());
Helper.drawAlarms(clock, size, 0.015, 0.46, alarmMap, DATE_TIME_FORMATTER, time);
}
private void redraw() {
double width = getWidth() - getInsets().getLeft() - getInsets().getRight();
double height = getHeight() - getInsets().getTop() - getInsets().getBottom();
size = width < height ? width : height;
if (size > 0) {
if (getWidth() > getHeight()) {
setTranslateX(0.5 * (getWidth() - size));
} else if (getHeight() > getWidth()) {
setTranslateY(0.5 * (getHeight() - size));
}
frame.setPrefSize(size, size);
frame.setBorder(gaugeDesign.getBorder(size));
background.setCenterX(size * 0.5);
background.setCenterY(size * 0.5);
background.setRadius(size * 0.4375);
background.setFill(gaugeBackground.getPaint(background.getLayoutBounds().getMinX(), background.getLayoutBounds().getMinY(),
background.getLayoutBounds().getMaxX(), background.getLayoutBounds().getMaxY()));
switch(gaugeDesign) {
case NONE:
frame.setVisible(false);
foreground.setVisible(false);
background.setVisible(false);
break;
case ENZO:
background.setFill(Color.rgb(240, 240, 240));
innerShadow.setRadius(0.07407407 * size);
innerShadow.setOffsetX(0);
innerShadow.setOffsetY(0.07407407 * size);
innerShadow.setColor(Color.rgb(0, 0, 0, 0.35));
foreground.setFill(Color.TRANSPARENT);
foreground.setStroke(null);
break;
default:
frame.setVisible(true);
foreground.setVisible(true);
background.setVisible(true);
innerShadow.setColor(Color.rgb(0, 0, 0, 0.65));
innerShadow.setRadius(0.08 * size);
innerShadow.setOffsetX(0);
innerShadow.setOffsetY(0.0 * size);
foreground.setFill(new RadialGradient(0, 0, size * 0.5, size * gaugeDesign.FRAME_FACTOR * 0.5, size, false, CycleMethod.NO_CYCLE,
new Stop(0, Color.rgb(255, 255, 255, 0.6)),
new Stop(0.4, Color.TRANSPARENT)));
foreground.setStroke(null);
break;
}
gauge.setPrefSize(size * (1.0 - gaugeDesign.FRAME_FACTOR * 2.0), size * (1.0 - gaugeDesign.FRAME_FACTOR * 2.0));
gauge.relocate(gaugeDesign.FRAME_FACTOR * size, gaugeDesign.FRAME_FACTOR * size);
foreground.setCenterX(size * 0.5);
foreground.setCenterY(size * 0.5);
foreground.setRadius(size * 0.42);
}
}
/**
* Constructor taking the application's name.
*/
public DoodleTrace() {
// Create the drawing surface
Pane drawSurface = new Pane();
setCenter(drawSurface);
// Initialize draw path
drawPath = new Path();
drawPath.setStrokeWidth(3);
drawPath.setStroke(Color.BLACK);
drawSurface.getChildren().add(drawPath);
// Initialize trace path
tracePath = new Path();
tracePath.setStrokeWidth(3);
tracePath.setStroke(Color.BLACK);
drawSurface.getChildren().add(tracePath);
// Ball tracer
RadialGradient gradient1 = new RadialGradient(
0,
0,
.5,
.5,
.55,
true,
CycleMethod.NO_CYCLE,
new Stop(0, Color.RED),
new Stop(1, Color.BLACK));
// Create a ball
ball = new Circle(100, 100, 20, gradient1);
// Add ball
drawSurface.getChildren().add(ball);
// Animation responsible for tracing the doodle
tracerTimeline = new Timeline();
// Flag to prevent user from doodling during animation
tracerTimeline.setOnFinished(ae3 -> animating = false);
if (Platform.isDesktop()) {
applyMouseInput(drawSurface);
} else if (Platform.isAndroid() || Platform.isIOS()) {
applyTouchInput(drawSurface);
}
}
private void draw() {
double size = getWidth() < getHeight() ? getWidth() : getHeight();
canvas.setWidth(size);
canvas.setHeight(size);
ctx.clearRect(0, 0, size, size);
if (isFrameVisible()) { //frame
Paint frame = new LinearGradient(0.14 * size, 0.14 * size,
0.84 * size, 0.84 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.rgb(20, 20, 20, 0.65)),
new Stop(0.15, Color.rgb(20, 20, 20, 0.65)),
new Stop(0.26, Color.rgb(41, 41, 41, 0.65)),
new Stop(0.26, Color.rgb(41, 41, 41, 0.64)),
new Stop(0.85, Color.rgb(200, 200, 200, 0.41)),
new Stop(1.0, Color.rgb(200, 200, 200, 0.35)));
ctx.setFill(frame);
ctx.fillOval(0, 0, size, size);
}
InnerShadow innerShadow = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(0, 0, 0, 0.65), 0.07 * size, 0, 0, 0);
if (isOn()) { //on
ctx.save();
Paint on = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, ((Color)ledColor.get()).deriveColor(0d, 1d, 0.77, 1d)),
new Stop(0.49, ((Color)ledColor.get()).deriveColor(0d, 1d, 0.5, 1d)),
new Stop(1.0, ((Color)ledColor.get())));
innerShadow.setInput(new DropShadow(BlurType.TWO_PASS_BOX, (Color)ledColor.get(), 0.36 * size, 0, 0, 0));
ctx.setEffect(innerShadow);
ctx.setFill(on);
ctx.fillOval(0.14 * size, 0.14 * size, 0.72 * size, 0.72 * size);
ctx.restore();
} else { // off
ctx.save();
Paint off = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, ((Color)ledColor.get()).deriveColor(0d, 1d, 0.20, 1d)),
new Stop(0.49, ((Color)ledColor.get()).deriveColor(0d, 1d, 0.13, 1d)),
new Stop(1.0, ((Color)ledColor.get()).deriveColor(0d, 1d, 0.2, 1d)));
ctx.setEffect(innerShadow);
ctx.setFill(off);
ctx.fillOval(0.14 * size, 0.14 * size, 0.72 * size, 0.72 * size);
ctx.restore();
}
//highlight
Paint highlight = new RadialGradient(0, 0,
0.3 * size, 0.3 * size,
0.29 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.WHITE),
new Stop(1.0, Color.TRANSPARENT));
ctx.setFill(highlight);
ctx.fillOval(0.21 * size, 0.21 * size, 0.58 * size, 0.58 * size);
}
private void resize() {
size = getSkinnable().getWidth() < getSkinnable().getHeight() ? getSkinnable().getWidth() : getSkinnable().getHeight();
centerX = size * 0.5;
centerY = size * 0.5;
final double RADIUS = size * 0.5 - 2;
valueBlendBottomShadow.setOffsetY(0.005 * size);
valueBlendTopShadow.setOffsetY(0.005 * size);
valueBlendTopShadow.setRadius(0.005 * size);
dropShadow.setRadius(0.015 * size);
dropShadow.setOffsetY(0.015 * size);
background.setPrefSize(size, size);
ticksAndSectionsCanvas.setWidth(size);
ticksAndSectionsCanvas.setHeight(size);
ticksAndSections.clearRect(0, 0, size, size);
drawSections(ticksAndSections);
drawTickMarks(ticksAndSections);
ticksAndSectionsCanvas.setCache(true);
ticksAndSectionsCanvas.setCacheHint(CacheHint.QUALITY);
drawMarkers();
minMeasuredValue.setPrefSize(0.03 * size, 0.03 * size);
minMeasuredValue.relocate((size - minMeasuredValue.getPrefWidth()) * 0.5, size * 0.11);
minMeasuredValueRotate.setPivotX(minMeasuredValue.getPrefWidth() * 0.5);
minMeasuredValueRotate.setPivotY(size * 0.39);
minMeasuredValueRotate.setAngle(getSkinnable().getMinMeasuredValue() * angleStep - 180 - getSkinnable().getStartAngle());
maxMeasuredValue.setPrefSize(0.03 * size, 0.03 * size);
maxMeasuredValue.relocate((size - maxMeasuredValue.getPrefWidth()) * 0.5, size * 0.11);
maxMeasuredValueRotate.setPivotX(maxMeasuredValue.getPrefWidth() * 0.5);
maxMeasuredValueRotate.setPivotY(size * 0.39);
maxMeasuredValueRotate.setAngle(getSkinnable().getMaxMeasuredValue() * angleStep - 180 - getSkinnable().getStartAngle());
threshold.setPrefSize(0.06 * size, 0.055 * size);
threshold.relocate((size - threshold.getPrefWidth()) * 0.5, size * 0.08);
thresholdRotate.setPivotX(threshold.getPrefWidth() * 0.5);
thresholdRotate.setPivotY(size * 0.42);
thresholdRotate.setAngle(getSkinnable().getThreshold() * angleStep - 180 - getSkinnable().getStartAngle());
value.setText(String.format(Locale.US, "%." + getSkinnable().getDecimals() + "f", (angle.get() / angleStep)));
bar.setCenterX(centerX);
bar.setCenterY(centerY);
bar.setRadiusX(RADIUS);
bar.setRadiusY(RADIUS);
if (getSkinnable().isBarGradientEnabled()) {
recalculateBarGradient();
Image image = barGradient.getImage(size, size);
bar.setFill(new ImagePattern(image, 0, 0, size, size, false));
} else {
bar.setFill(new RadialGradient(0, 0,
centerX, centerY,
RADIUS, false, CycleMethod.NO_CYCLE,
new Stop(0.0, barColor),
new Stop(0.76, barColor.deriveColor(-5, 1, 1, 1)), // -5 for on the barColorHue)
new Stop(0.79, barColor),
new Stop(0.97, barColor),
new Stop(1.0, barColor.deriveColor(-5, 1, 1, 1)))); // -5 for on the barColorHue)
}
knob.setPrefSize(size * 0.75, size * 0.75);
knob.setTranslateX((size - knob.getPrefWidth()) * 0.5);
knob.setTranslateY((size - knob.getPrefHeight()) * 0.5);
resizeText();
}
private void draw() {
double size = getWidth() < getHeight() ? getWidth() : getHeight();
canvas.setWidth(size);
canvas.setHeight(size);
ctx.clearRect(0, 0, size, size);
if (isFrameVisible()) { //frame
Paint frame = new LinearGradient(0.14 * size, 0.14 * size,
0.84 * size, 0.84 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.rgb(20, 20, 20, 0.65)),
new Stop(0.15, Color.rgb(20, 20, 20, 0.65)),
new Stop(0.26, Color.rgb(41, 41, 41, 0.65)),
new Stop(0.26, Color.rgb(41, 41, 41, 0.64)),
new Stop(0.85, Color.rgb(200, 200, 200, 0.41)),
new Stop(1.0, Color.rgb(200, 200, 200, 0.35)));
ctx.setFill(frame);
ctx.fillOval(0, 0, size, size);
}
InnerShadow innerShadow = new InnerShadow(BlurType.TWO_PASS_BOX, Color.rgb(0, 0, 0, 0.65), 0.07 * size, 0, 0, 0);
if (isOn()) { //on
ctx.save();
Paint on = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, ledColor.get().deriveColor(0d, 1d, 0.77, 1d)),
new Stop(0.49, ledColor.get().deriveColor(0d, 1d, 0.5, 1d)),
new Stop(1.0, ledColor.get()));
innerShadow.setInput(new DropShadow(BlurType.TWO_PASS_BOX, ledColor.get(), 0.36 * size, 0, 0, 0));
ctx.setEffect(innerShadow);
ctx.setFill(on);
ctx.fillOval(0.14 * size, 0.14 * size, 0.72 * size, 0.72 * size);
ctx.restore();
} else { // off
ctx.save();
Paint off = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, ledColor.get().deriveColor(0d, 1d, 0.20, 1d)),
new Stop(0.49, ledColor.get().deriveColor(0d, 1d, 0.13, 1d)),
new Stop(1.0, ledColor.get().deriveColor(0d, 1d, 0.2, 1d)));
ctx.setEffect(innerShadow);
ctx.setFill(off);
ctx.fillOval(0.14 * size, 0.14 * size, 0.72 * size, 0.72 * size);
ctx.restore();
}
//highlight
Paint highlight = new RadialGradient(0, 0,
0.3 * size, 0.3 * size,
0.29 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.WHITE),
new Stop(1.0, Color.TRANSPARENT));
ctx.setFill(highlight);
ctx.fillOval(0.21 * size, 0.21 * size, 0.58 * size, 0.58 * size);
}
private void resize() {
size = getSkinnable().getWidth() < getSkinnable().getHeight() ? getSkinnable().getWidth() : getSkinnable().getHeight();
frameFill = new LinearGradient(0.14 * size, 0.14 * size,
0.84 * size, 0.84 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.color(0.0784313725, 0.0784313725, 0.0784313725, 0.6470588235)),
new Stop(0.15, Color.color(0.0784313725, 0.0784313725, 0.0784313725, 0.6470588235)),
new Stop(0.26, Color.color(0.1607843137, 0.1607843137, 0.1607843137, 0.6470588235)),
new Stop(0.2600001, Color.color(0.1607843137, 0.1607843137, 0.1607843137, 0.6431372549)),
new Stop(0.85, Color.color(0.7843137255, 0.7843137255, 0.7843137255, 0.4039215686)),
new Stop(1.0, Color.color(0.7843137255, 0.7843137255, 0.7843137255, 0.3450980392)));
frame.setRadius(0.5 * size);
frame.setCenterX(0.5 * size);
frame.setCenterY(0.5 * size);
frame.setFill(frameFill);
mainOnFill = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.color(0.7098039216, 0, 0, 1)),
new Stop(0.49, Color.color(0.4392156863, 0, 0, 1)),
new Stop(1.0, Color.color(0.9843137255, 0, 0, 1)));
mainOffFill = new LinearGradient(0.25 * size, 0.25 * size,
0.74 * size, 0.74 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.color(0.2039215686, 0.0588235294, 0.0784313725, 1)),
new Stop(0.49, Color.color(0.1450980392, 0, 0, 1)),
new Stop(1.0, Color.color(0.2039215686, 0.0588235294, 0.0784313725, 1)));
innerShadow.setRadius(0.07 * size);
glow.setRadius(0.36 * size);
glow.setColor((Color) getSkinnable().getLedColor());
main.setRadius(0.36 * size);
main.setCenterX(0.5 * size);
main.setCenterY(0.5 * size);
if (getSkinnable().isOn()) {
main.setFill(mainOnFill);
main.setEffect(glow);
} else {
main.setFill(mainOffFill);
main.setEffect(innerShadow);
}
highlightFill = new RadialGradient(0, 0,
0.3 * size, 0.3 * size,
0.29 * size,
false, CycleMethod.NO_CYCLE,
new Stop(0.0, Color.WHITE),
new Stop(1.0, Color.TRANSPARENT));
highlight.setRadius(0.29 * size);
highlight.setCenterX(0.5 * size);
highlight.setCenterY(0.5 * size);
highlight.setFill(highlightFill);
}
/**
* Returns <code>true</code> if the given {@link Paint} is considered to be
* an "advanced" gradient. Otherwise returns <code>false</code>. An advanced
* gradient can either be a linear gradient with at least 3 stops, or any
* radial gradient.
*
* @param paint
* The {@link Paint} in question.
* @return <code>true</code> if the given {@link Paint} is considered to be
* an "advanced" gradient, othwerise <code>false</code>.
*/
public static boolean isAdvancedLinearGradient(Paint paint) {
if (paint instanceof LinearGradient) {
return ((LinearGradient) paint).getStops().size() > 2;
} else if (paint instanceof RadialGradient) {
return true;
}
return false;
}