JavaFX官方教程(十)之转换类型和示例
翻译自 Transformation Types and Examples
本文档描述了特定的转换并提供了代码示例。
转换
平移变换沿着相对于其初始位置的一个轴将节点从一个位置移动到另一个位置。木琴条的初始位置由x,y和z坐标定义。在实施例2-1中,初始位置值由指定的xStart
,yPos
和zPos
变量。添加一些其他变量以简化应用不同变换时的计算。木琴的每个杆都基于其中一个基杆。然后,该示例沿三个轴平移不同移位的基条,以在空间中正确定位它们。
示例2-1显示了具有转换转换的示例应用程序的代码片段。
Group rectangleGroup = new Group();rectangleGroup.setDepthTest(DepthTest.ENABLE);double xStart = 260.0;double xOffset = 30.0;double yPos = 300.0;double zPos = 0.0;double barWidth = 22.0;double barDepth = 7.0;// Base1Cube base1Cube = new Cube(1.0, new Color(0.2, 0.12, 0.1, 1.0), 1.0);base1Cube.setTranslateX(xStart + 135);base1Cube.setTranslateZ(yPos+20.0);base1Cube.setTranslateY(11.0);
回转
旋转变换使节点围绕场景的指定枢轴点移动。您可以使用类的rotate
方法Transform
来执行旋转。
要在示例应用程序中围绕木琴旋转相机,使用旋转变换,但从技术上讲,当鼠标旋转相机时,木琴本身就会移动。
例2-2显示了旋转变换的代码。
class Cam extends Group {Translate t = new Translate();Translate p = new Translate();Translate ip = new Translate();Rotate rx = new Rotate();{ rx.setAxis(Rotate.X_AXIS); }Rotate ry = new Rotate();{ ry.setAxis(Rotate.Y_AXIS); }Rotate rz = new Rotate();{ rz.setAxis(Rotate.Z_AXIS); }Scale s = new Scale();public Cam() { super(); getTransforms().addAll(t, p, rx, rz, ry, s, ip); }}
...scene.setOnMouseDragged(new EventHandler<MouseEvent>() {public void handle(MouseEvent me) {mouseOldX = mousePosX;mouseOldY = mousePosY;mousePosX = me.getX();mousePosY = me.getY();mouseDeltaX = mousePosX - mouseOldX;mouseDeltaY = mousePosY - mouseOldY;if (me.isAltDown() && me.isShiftDown() && me.isPrimaryButtonDown()) {cam.rz.setAngle(cam.rz.getAngle() - mouseDeltaX);}else if (me.isAltDown() && me.isPrimaryButtonDown()) {cam.ry.setAngle(cam.ry.getAngle() - mouseDeltaX);cam.rx.setAngle(cam.rx.getAngle() + mouseDeltaY);}else if (me.isAltDown() && me.isSecondaryButtonDown()) {double scale = cam.s.getX();double newScale = scale + mouseDeltaX*0.01;cam.s.setX(newScale); cam.s.setY(newScale); cam.s.setZ(newScale);}else if (me.isAltDown() && me.isMiddleButtonDown()) {cam.t.setX(cam.t.getX() + mouseDeltaX);cam.t.setY(cam.t.getY() + mouseDeltaY);}}});
请注意,轴心点和角度定义了图像移动到的目标点。指定轴心点时要仔细计算值。否则,图像可能会出现在不希望出现的位置。有关更多信息,请参阅API文档。
缩放
缩放变换使节点看起来更大或更小,具体取决于缩放因子。缩放会更改节点,以便沿其轴的尺寸乘以比例因子。与旋转变换类似,缩放变换应用于枢轴点。该枢轴点被认为是围绕其发生缩放的点。
要缩放,请使用Scale
类的类和scale
方法Transform
。
在Xylophone应用程序中,您可以在按Alt和鼠标右键的同时使用鼠标缩放木琴。比例变换用于查看缩放。
例2-3显示了比例转换的代码。
else if (me.isAltDown() && me.isSecondaryButtonDown()) {double scale = cam.s.getX();double newScale = scale + mouseDeltaX*0.01;cam.s.setX(newScale); cam.s.setY(newScale); cam.s.setZ(newScale);}
...
剪毛
剪切变换使一个轴旋转,使得x轴和y轴不再垂直。节点的坐标移动指定的乘数。
要剪切,请使用Shear
类的类或shear
方法Transform
。
在Xylophone应用程序中,您可以通过拖动鼠标来剪切木琴,同时按住Shift并按下鼠标左键。
else if (me.isShiftDown() && me.isPrimaryButtonDown()) {double yShear = shear.getY();shear.setY(yShear + mouseDeltaY/1000.0);double xShear = shear.getX();shear.setX(xShear + mouseDeltaX/1000.0);
}
多重转换
您可以通过指定有序的转换链来构造多个转换。例如,您可以缩放对象然后对其应用剪切变换,或者您可以翻译对象然后缩放它。
示例2-5显示了应用于对象以创建木琴栏的多个转换。
Cube base1Cube = new Cube(1.0, new Color(0.2, 0.12, 0.1, 1.0), 1.0);base1Cube.setTranslateX(xStart + 135);base1Cube.setTranslateZ(yPos+20.0);base1Cube.setTranslateY(11.0);base1Cube.setScaleX(barWidth*11.5);base1Cube.setScaleZ(10.0);base1Cube.setScaleY(barDepth*2.0);
应用文件
源代码
Xylophone.java
NetBeans项目
transformations.zip
JavaFX官方教程(十)之转换类型和示例相关推荐
- JavaFX官方教程(十五)之A Xylophone.java
翻译自 Xylophone.java 一个 Xylophone.java 有关说明,请参阅转换类型和示例. 法律条款和版权声明 / **版权所有(c)2010,2014,Oracle和/或其附属公司 ...
- JavaFX官方教程(十一)之动画基础
翻译自 动画基础 动画基础提供基本动画概念,包含以下部分: 转变 时间线动画 插值 JavaFX中的动画可以分为时间轴动画和过渡.本章提供了每种动画类型的示例. Timeline并且Transit ...
- JavaFX官方教程(一)之JavaFX概述
翻译自 JavaFX概述 本章概述了可以使用JavaFX API构建的应用程序类型,下载JavaFX库的位置以及有关正在交付的关键JavaFX功能的高级信息. JavaFX是一组图形和媒体包,使开发 ...
- JavaFX官方教程(十四)之转换,动画和视觉效果教程的源代码
翻译自 转换,动画和视觉效果教程的源代码 下表列出了本文档中的演示应用程序及其关联的源代码文件. 教程 源代码 NetBeans项目文件 转换概述 Xylophone.java transforma ...
- JavaFX官方教程(九)之转换
翻译自 Transformations Overview 本章介绍JavaFX中支持的转换. 所有转换都位于javafx.scene.transform包中,并且是类的子Transform类. 介绍 ...
- JavaFX官方教程(十二)之树动画示例
翻译自 树动画示例 本章提供有关树动画示例的详细信息.您将了解场景中的所有元素是如何创建和动画的. 图4-1显示了带树的场景. 图4-1树动画 项目和要素 树动画项目由几个文件组成.每个元素,如树叶 ...
- JavaFX官方教程(八)之JavaFX中的动画和视觉效果
翻译自 JavaFX中的动画和视觉效果 您可以使用JavaFX快速开发具有丰富用户体验的应用程序.在本入门教程中,您将学习如何使用非常少的编码创建动画对象并获得复杂的效果. 图7-1显示了要创建的应 ...
- JavaFX官方教程(二)之JavaFX体系结构
翻译自 JavaFX体系结构 本章提供了JavaFX体系结构和生态系统的高级描述. 图2-1说明了JavaFX平台的架构组件.图中的部分描述了每个组件以及这些部件如何互连.JavaFX公共API下 ...
- JavaFX官方教程(七)之使用FXML创建用户界面
翻译自 使用FXML创建用户界面 本教程展示了使用JavaFX FXML的好处,JavaFX FXML是一种基于XML的语言,它提供了构建与代码的应用程序逻辑分开的用户界面的结构. 如果您从一开始就 ...
最新文章
- SpringCloud Alibaba微服务实战(六) - 路由网关(Gateway)
- 取得Repeater内部控件命令名与命令参数
- 数据有序_Redis实战(3)-数据结构List实战一之商品信息的有序存储
- 在SpringBoot中使用slf4j与logbak
- 简明易懂的call apply
- php 合并数组 效率,PHP将两个关联数组合并函数-增高函数效率
- 加量不加价!极速人脸检测库libfacedetection升级v3版,新增五点检测
- 公司这个月要同时完成好多项目!!!
- idea项目没法继承httpservlet_SpringBoot项目发布为war
- 网络驱动器映射成功但无法实时更新文件需要重新连接_无边界办公——WebDAV文件共享服务构建...
- PHP文件流下载内容
- Spring 揭秘之Spring框架的由来
- RecyclerView 数据刷新的几种方式 局部刷新 notify MD
- Ubuntu代理服务器设置上网
- 卸载IE9重装IE9无法安装的原因及解决方法
- 师傅!华为eNSP报错啦!别担心,一篇文章教会你
- Hot Research Topics
- 尚硅谷大数据项目之电商数仓(4即席查询数据仓库)
- Mask RcNN论文翻译
- 使用MBROSTool 工具制作本地硬盘多启动盘的方法总结
热门文章
- Android切换泰语,Android应用内切换语言
- [C++11]可调用对象包装器function
- [C++STL]常用遍历算法
- [Java基础]File基础
- python数据收集整理教案_数据收集整理教案讲解学习
- 半平面交练习(计算几何)
- HDU 5528 Count a * b
- P4151 [WC2011]最大XOR和路径(线性基应用)
- POJ3320 Jessica's Reading Problem 尺取法
- AtCoder Regular Contest 059