首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >在JavaFX中将圆形更改为正方形以填充正方形

在JavaFX中将圆形更改为正方形以填充正方形
EN

Stack Overflow用户
提问于 2020-03-30 15:50:14
回答 1查看 247关注 0票数 0

我发现了一个令人惊叹的动画,其中有一个从圆形/椭圆过渡到正方形的动画,就在动画结束之前,正方形稍微突出了一点,然后将自己调整回正确的大小。

来源:https://clementmihailescu.github.io/Pathfinding-Visualizer/#

我试图重新创建它,但我无法获得从一滴墨水到正方形的过渡效果。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
package sample;

import javafx.animation.*;
import javafx.application.Application;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.effect.Lighting;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Circle;
import javafx.scene.text.Text;
import javafx.util.Duration;

public class Main extends Application {

@Override
public void start(Stage primaryStage) throws Exception {
    Pane root = new Pane();
    Rectangle originalRectangle = new Rectangle(100,100);
    originalRectangle.setFill(Color.WHITE);
    originalRectangle.setStroke(Color.BLUE);
    Rectangle substituteRectangle = new Rectangle(25,25,50,50);
    substituteRectangle.setOpacity(0.0);
    substituteRectangle.setFill(Color.TURQUOISE);
    substituteRectangle.setStroke(Color.TURQUOISE);
    Rectangle yellowRectangle = new Rectangle(100,100);
    yellowRectangle.setFill(Color.YELLOW);
    root.getChildren().addAll(originalRectangle,substituteRectangle,yellowRectangle);


    FadeTransition fadeOutTransition = new FadeTransition(Duration.millis(3000),yellowRectangle);    //Make the duration as 1ms to get the instant 
    fadeOutTransition.setFromValue(1.0);
    fadeOutTransition.setToValue(0.0);

    FadeTransition fadeInTransition = new FadeTransition(Duration.millis(1),substituteRectangle);
    fadeInTransition.setFromValue(0.0);
    fadeInTransition.setToValue(0.8);

//To make the square protrute out a bit
    ScaleTransition scaleTransition = new ScaleTransition(Duration.seconds(4),substituteRectangle);
    scaleTransition.setToX(2.1);
    scaleTransition.setToY(2.1);

    ParallelTransition parallelTransition = new ParallelTransition(scaleTransition,fadeInTransition);

    fadeOutTransition.play();
    fadeOutTransition.setOnFinished(e -> {
        parallelTransition.setOnFinished(event -> {
            root.getChildren().removeAll(substituteRectangle,yellowRectangle);
            originalRectangle.setOpacity(1.0);
            originalRectangle.setFill(Color.RED);
        });
        parallelTransition.play();
    });
    Scene scene = new Scene(root,800,600);
    primaryStage.setScene(scene);
    primaryStage.show();
}

public static void main(String[] args) {
    Application.launch(args);
}
}
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-03-30 16:18:48

实现这种动画的最简单方法可能是简单地设置圆的半径动画,并使用Rectangle作为剪辑来约束它的大小。此外,Timeline通常会提供非常适合替换多个过渡的动画。在这种情况下,它允许颜色之间的动画以及DoubleProperty的动画,这使得它成为简化动画的一个很好的选择:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
@Override
public void start(Stage primaryStage) throws Exception {
    Pane root = new Pane();
    Rectangle bounds = new Rectangle(50, 50, 100, 100);
    Circle circle = new Circle(bounds.getX() + 0.5 * bounds.getWidth(), bounds.getY() + 0.5 * bounds.getHeight(),
            0);
    circle.setClip(bounds);
    root.getChildren().add(circle);

    Timeline animation = new Timeline(
            new KeyFrame(Duration.ZERO, new KeyValue(circle.fillProperty(), Color.BLUE),
                    new KeyValue(circle.radiusProperty(), 0d)),
            new KeyFrame(Duration.seconds(5), new KeyValue(circle.fillProperty(), Color.RED), new KeyValue(
                    circle.radiusProperty(), 0.5 * Math.hypot(bounds.getWidth(), bounds.getHeight())))); // at the end of the animation the circle should reach the corners -> diameter = diagonale of rect

    root.setOnMouseClicked(evt -> animation.playFromStart());

    Scene scene = new Scene(root, 800, 600);
    primaryStage.setScene(scene);
    primaryStage.show();
}
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60934346

复制
相关文章
pycharm添加anaconda解释器_anaconda找不到指定模块
PyCharm使用anaconda新建环境是只包含一些基础包,后续如果想要如Scrapy.requests等库的话则需要自己在解释器页面添加了(ctrl+alt+s进入解释器设置页面)
全栈程序员站长
2022/09/27
2.2K0
pycharm添加anaconda解释器_anaconda找不到指定模块
Qt::Qt Log日志模块
这几天在交接工作,把之前手头的一个项目交接一下,想着增加一个日志模块,去查了一下,Qt自带的日志模块 qInstallMessageHandler 。
何其不顾四月天
2023/03/10
1.9K0
Qt模块介绍
Qt5中,模块已经非常细化了,关于模块的详细信息可以在帮助文档中看到。Qt的帮助文档叫Qt助手。为了方便使用,我们一般都是把它固定在任务栏。
zy010101
2020/04/08
1.3K0
创建Qt子工程
❝使用QtCreator创建子工程(方便组织和管理项目工程)。 ❞ 「创建项目」。 选择「其他项目」->「子目录项目」。 设置项目「名字」和「路径」。 一直到下一步直到「完成&添加子项目」。 创建好项
Qt君
2020/02/24
7430
Qt多线程创建
传统的图形用户界面应用程序都只有一个执行线程,并且一次只执行一个操作。如果用户从用户界面中调用一个比较耗时的操作,当该操作正在执行时,用户界面通常会冻结而不再响应。这个问题可以用事件处理和多线程来解决。
zls365
2020/10/30
1.3K0
Qt多线程创建
[常见问题]解决创建servlet 找不到webservlet包.
今天在创建一个springmvc项目的时候发现 使用的HttpServletRequest不起作用, 提示需要映入 jar文件, 于是便有了今天的这个问题: image.png 百度了下才发现 项目需要导入Runtime Envorionment, 于是导入了电脑中配置的Tomcat 9.0. 可是选择好后还是不行, 于是继续百度, 发现原因是Tomcat 版本9.0 高于JDK版本8.0. 于是更换本机Tomcat版本, 问题得以解决.  image.png image.png 总结: 以后当遇到这种问题
一枝花算不算浪漫
2018/05/18
2.7K0
【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 创建 Qt 桌面程序 | 构建并运行 Qt 桌面程序 )
首先要安装 Qt 开发环境 , 参考 【Qt】Qt 开发环境安装 ( Qt 版本 5.14.2 | Qt 下载 | Qt 安装 ) 博客 ;
韩曙亮
2023/03/29
3.5K0
【Qt】Qt 开发桌面程序 ( Qt 版本 5.14.2 | 创建 Qt 桌面程序 | 构建并运行 Qt 桌面程序 )
Qt插件创建及加载
上次我们是直接在Qt 自带的例子基础上做的修改,直接运行。我们的插件需要继承Qt 的Style插件,之后重新实现自己想要实现的部分。在主程序中直接通过QApplication::setStyle进行调用。
用户5908113
2019/12/19
1.8K0
【QT】QT布局管理器
布局管理器 设计模式实现布局 详情见工具栏 垂直布局,水平布局,打破布局。 代码实现布局 main.cpp #include "testlayout.h" #include <QApplication> #include<QLabel> #include<QLineEdit> #include<QFormLayout> #include<QRadioButton> #include<QVBoxLayout> #include<QPushButton> #include<QSpacerItem> in
半生瓜的blog
2023/05/13
6020
【QT】QT布局管理器
Qt候选器
❝QLineEdit和QCompleter组成水果输入候选词示例。❞ 简单代码 /* 创建水果类型候选词 */ QStringList fruits; fruits << "apple" << "pe
Qt君
2020/03/19
4241
Qt候选器
Qt Quick实践系列-导入模块
  另外我们使用得比较多的是自定义模块的导入,这里每个qml后缀的文件都可以被当成一个模块(组件)。如:
Qt君
2020/06/17
1.2K0
Qt的简易日志模块封装
C++的下的日志库有很多,如log4cpp、Easylogging++,eplog,g3log,Qt下也有log4qt。
杨永贞
2022/08/11
7940
Qt的简易日志模块封装
使用QT创建系统托盘
使用QT来创建一个系统托盘,事实上是一件很简单的事。为什么这么说?一是因为QT文档给出了比较详细的例子,二是QT的结构比较优雅,设计风格统一。但是在动手之前,我们要从哪里下手?虽然QT文档给出了一个比较详细的例子,但由于功能较多,所以看起来比较费劲。我们在这只是抽丝剥茧,只实现系统托盘这一个功能。 首先,使用QT creator创建一个GUI工程,继承于QDialog还是QMainWindow还是QWidget都无所谓。我们以继承QMainWindow为例说明。创建完毕之后,creator将自动生成一些文件
24K纯开源
2018/01/18
2.7K0
使用QT创建系统托盘
pycharm python解释器找不到,pycharm找不到解释器怎么办[通俗易懂]
解决方法:1、打开磁盘,直接搜索python.exe文件,获取该文件的路径;2、打开pycharm软件,依次点击“File”–“Setting”–“Project”,点击右上角的设置图标;3、按照获取的路径找到python.exe即可。
全栈程序员站长
2022/09/27
9.5K0
pycharm python解释器找不到,pycharm找不到解释器怎么办[通俗易懂]
[754]ImportError: DLL load failed: 找不到指定的模块
在tensorflow的学习中,想使用tensorflow-gpu版的学习,充分利用计算机。但是跟网上很多博主的方法安装gpu,cuda是安装成功了,但是却一直报以下一个错误。
周小董
2020/02/14
14.7K0
[754]ImportError: DLL load failed: 找不到指定的模块
模块已加载,但找不到入口点DLLRegisterServer[通俗易懂]
大家好,我是架构君,一个会写代码吟诗的架构师。今天说一说模块已加载,但找不到入口点DLLRegisterServer[通俗易懂],希望能够帮助大家进步!!!
Java架构师必看
2022/08/01
51.9K1
模块已加载,但找不到入口点DLLRegisterServer[通俗易懂]
看看Qt 6.0 支持哪些模块吧
  Qt 6.0 已在12月8日发布了。Qt 6.0是下一代Qt的起点。但是令人遗憾的是它的功能尚未达到Qt 5.15的高度,但我们将在未来几个月内填补空白。
Qt君
2023/03/17
7230
看看Qt 6.0 支持哪些模块吧
Qt创建一个OpenGL窗口
点击上方蓝字可直接关注!方便下次阅读。如果对你有帮助,可以点个在看,让它可以帮助到更多同志~
用户5908113
2019/12/19
2.3K0
Qt(MinGW ) Windows下创建动态库
上一次和大家分享的是Linux下Qt创建共享库并链接共享库,这次和大家分享的是Windows下Qt创建共享库并链接共享库。大家肯定注意到标题中Qt后面括号中的minGW,为什么要加上minGW呢?先卖个关子,后面的介绍中会解释的。
用户5908113
2019/12/05
2.6K0
Qt(MinGW ) Windows下创建动态库
Qt Quick实践系列-创建简单例子
❝介绍如何创建一个QML简单例子。 ❞ 创建QML例子步骤 "文件"->"新键文件或项目"。 选择"Qt Quick Application"。 设置项目名字。 设置编译环境,这里设置的是Mingw编
Qt君
2020/05/08
8480
Qt Quick实践系列-创建简单例子

相似问题

删除所有包含Year != Pandas的行

211

包含列表中所有值的Pandas DataFrame行

12

从pandas中的DataFrame中删除包含所有NaN的行

21

删除Pandas中包含某些字符串列表的行

23

从Pandas DF中删除包含列表中元素的行

23
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文