JavaFX官方教程(十三)之应用效果

翻译自  Applying Effects

创建视觉效果包含以下主题:

  • 混合效果

  • 绽放效果

  • 模糊效果

  • 投影效果

  • 内阴影效果

  • 反射

  • 照明效果

  • 透视效果

  • 创建一系列效果

介绍如何使用视觉效果来增强JavaFX应用程序的外观。

所有效果都位于javafx.scene.effect包中,并且是类的子Effect类。有关特定类,方法或其他功能的更多信息,请参阅API文档。

混合效果

混合是一种效果,它使用一种预定义的混合模式将两个输入组合在一起。

在节点blend(node.setBlendMode())的情况下,两个输入是:

  • 正在渲染的节点(顶部输入)

  • 节点下面的所有内容(底部输入)

底部输入的确定基于以下规则:

  • 包括同一组中的所有较低Z阶兄弟姐妹。

  • 如果组具有已定义的混合模式,则该过程停止,并定义底部输入。

  • 如果该组具有默认混合模式,则包含该组下面的所有内容,使用相同的规则递归。

  • 如果进程递归返回到根节点,则包含场景的背景绘制。

注意:

如果场景的背景颜色(通常是不透明的颜色)包含在底部输入中,则SRC_ATOP模式渲染在完全不透明的底部源上并且没有效果。在这种情况下,SRC_ATOP模式相当于SRC_OVER

混合模式定义了对象混合在一起的方式。例如,在图5-1中,您可以看到应用于与方形分组的圆的某些混合模式的示例。

图5-1不同的混合模式

示例5-1显示了示例应用程序中混合效果的代码片段。

例5-1混合效果

static Node blendMode() {Rectangle r = new Rectangle();r.setX(590);r.setY(50);r.setWidth(50);r.setHeight(50);r.setFill(Color.BLUE);Circle c = new Circle();c.setFill(Color.RED);c.setCenterX(590);c.setCenterY(50);c.setRadius(25);c.setBlendMode(BlendMode.SRC_ATOP);Group g = new Group();g.setBlendMode(BlendMode.SRC_OVER);g.getChildren().add(r);g.getChildren().add(c);return g;}

绽放效果

基于可配置的阈值,布隆效果使图像看起来发光的部分更亮。阈值从0.0到1.0不等。默认情况下,阈值设置为0.3。

图5-2显示了默认阈值和阈值1.0下的bloom效果。

图5-2绽放效果

示例5-2显示了使用bloom效果的示例应用程序的代码片段。

例5-2 Bloom示例

static Node bloom() {Group g = new Group();Rectangle r = new Rectangle();r.setX(10);r.setY(10);r.setWidth(160);r.setHeight(80);r.setFill(Color.DARKBLUE);Text t = new Text();t.setText("Bloom!");t.setFill(Color.YELLOW);t.setFont(Font.font("null", FontWeight.BOLD, 36));t.setX(25);t.setY(65);g.setCache(true);//g.setEffect(new Bloom());Bloom bloom = new Bloom();bloom.setThreshold(1.0);g.setEffect(bloom);g.getChildren().add(r);g.getChildren().add(t);g.setTranslateX(350);return g;}

模糊效果

模糊是可用于为所选对象提供更多焦点的常见效果。使用JavaFX,您可以应用bo​​xblur,运动模糊或高斯模糊。

BoxBlur

BoxBlur是一种模糊效果,它使用简单的盒式滤镜内核,在两个维度中可单独配置大小以控制应用于对象的模糊量,以及Iterations控制结果模糊质量的参数。

图5-3显示了两个模糊文本样本。

图5-3 BoxBlur效果

示例5-3是使用BoxBlur效果的代码段。

例5-3 BoxBlur示例

static Node boxBlur() {Text t = new Text();t.setText("Blurry Text!");t.setFill(Color.RED);t.setFont(Font.font("null", FontWeight.BOLD, 36));t.setX(10);t.setY(40);BoxBlur bb = new BoxBlur();bb.setWidth(5);bb.setHeight(5);bb.setIterations(3);t.setEffect(bb);t.setTranslateX(300);t.setTranslateY(100);return t;}

运动模糊

运动模糊效果使用高斯模糊,具有可配置的半径和角度,以创建移动对象的效果。

图5-4显示了运动模糊对文本的影响。

图5-4运动模糊效果

示例5-4显示了一个代码片段,该示例代码片段在示例应用程序中创建半径设置为15且角度设置为45的运动模糊效果。

例5-4运动模糊示例

static Node motionBlur() {Text t = new Text();t.setX(20.0f);t.setY(80.0f);t.setText("Motion Blur");t.setFill(Color.RED);t.setFont(Font.font("null", FontWeight.BOLD, 60));MotionBlur mb = new MotionBlur();mb.setRadius(15.0f);mb.setAngle(45.0f);t.setEffect(mb);t.setTranslateX(300);t.setTranslateY(150);return t;}

高斯模糊

高斯模糊是使用具有可配置半径的高斯算法来模糊对象的效果。

图5-5显示了高斯模糊对文本的影响。

图5-5高斯模糊

例5-5显示了使用高斯模糊效果模糊文本的代码片段。

例5-5高斯模糊

static Node gaussianBlur() {Text t2 = new Text();t2.setX(10.0f);t2.setY(140.0f);t2.setCache(true);t2.setText("Gaussian Blur");t2.setFill(Color.RED);t2.setFont(Font.font("null", FontWeight.BOLD, 36));t2.setEffect(new GaussianBlur());return t2;}

投影效果

投影是一种效果,可以呈现应用它的内容的阴影。您可以指定阴影的颜色,半径,偏移和一些其他参数。

图5-6显示了不同对象的阴影效果。

图5-6投影示例

例5-6显示了如何在文本和圆上创建阴影。

例5-6带阴影的文本和圆圈

import javafx.collections.ObservableList;
import javafx.application.Application;
import javafx.scene.*;
import javafx.stage.*;
import javafx.scene.shape.*;
import javafx.scene.effect.*;
import javafx.scene.paint.*;
import javafx.scene.text.*;public class HelloEffects extends Application {Stage stage;Scene scene;@Override public void start(Stage stage) {stage.show();scene = new Scene(new Group(), 840, 680);ObservableList<Node> content = ((Group)scene.getRoot()).getChildren();content.add(dropShadow());        stage.setScene(scene);}static Node dropShadow() {Group g = new Group();DropShadow ds = new DropShadow();ds.setOffsetY(3.0);ds.setOffsetX(3.0);ds.setColor(Color.GRAY);Text t = new Text();t.setEffect(ds);t.setCache(true);t.setX(20.0f);t.setY(70.0f);t.setFill(Color.RED);t.setText("JavaFX drop shadow effect");t.setFont(Font.font("null", FontWeight.BOLD, 32));DropShadow ds1 = new DropShadow();ds1.setOffsetY(4.0f);ds1.setOffsetX(4.0f);ds1.setColor(Color.CORAL);Circle c = new Circle();c.setEffect(ds1);c.setCenterX(50.0f);c.setCenterY(325.0f);c.setRadius(30.0f);c.setFill(Color.RED);c.setCache(true);g.getChildren().add(t);g.getChildren().add(c);return g;}public static void main(String[] args) {Application.launch(args);}
}

提示:

  • 使阴影太宽,使元素看起来沉重。阴影的颜色应该是真实的,通常比背景颜色浅一些。

  • 如果您有多个具有阴影的对象,请为所有对象定义相同的阴影。投影会给出来自一个方向的光的外观并在物体上投射阴影。

内阴影效果

内部阴影是一种效果,可以使用指定的颜色,半径和偏移量在给定内容的边缘内渲染阴影。

图5-7显示了纯文本和应用了内部阴影效果的相同文本。

图5-7内阴影

例5-7显示了如何在文本上创建内部阴影。

例5-7内阴影

static Node innerShadow() {InnerShadow is = new InnerShadow();is.setOffsetX(2.0f);is.setOffsetY(2.0f);Text t = new Text();t.setEffect(is);t.setX(20);t.setY(100);t.setText("Inner Shadow");t.setFill(Color.RED);t.setFont(Font.font("null", FontWeight.BOLD, 80));t.setTranslateX(300);t.setTranslateY(300);return t;}

反射

反射是一种效果,它将对象的反射版本呈现在实际对象下方。

注意:

具有反射效果的节点的反射将不响应节点上的鼠标事件或包含方法。

图5-8显示了应用于文本的反射。使用此setFraction方法指定可见反射的量。

图5-8反射效果

例5-8显示了如何在文本上创建反射效果。

示例5-8带反射的文本

import javafx.scene.text.*;
import javafx.scene.paint.*;
import javafx.scene.effect.*;
public class HelloEffects extends Application {Stage stage;Scene scene;@Override public void start(Stage stage) {stage.show();scene = new Scene(new Group(), 840, 680);ObservableList<Node> content = ((Group)scene.getRoot()).getChildren();content.add(reflection());stage.setScene(scene);}static Node reflection() {Text t = new Text();t.setX(10.0f);t.setY(50.0f);t.setCache(true);t.setText("Reflection in JavaFX...");t.setFill(Color.RED);t.setFont(Font.font("null", FontWeight.BOLD, 30));Reflection r = new Reflection();r.setFraction(0.9);t.setEffect(r);t.setTranslateY(400);return t;}public static void main(String[] args) {Application.launch(args);}
}

照明效果

照明效果模拟照射在给定内容上的光源,其可用于使平面物体具有更逼真的三维外观。

图5-9显示了文本的照明效果。

图5-9照明效果

例5-9显示了如何在文本上创建光照效果。

示例5-9带有应用光照效果的文本

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.geometry.VPos;
import javafx.scene.effect.Light.Distant;
import javafx.scene.*;
import javafx.stage.*;
import javafx.scene.shape.*;
import javafx.scene.effect.*;
import javafx.scene.paint.*;
import javafx.scene.text.*;public class HelloEffects extends Application {Stage stage;Scene scene;@Override public void start(Stage stage) {stage.show();scene = new Scene(new Group());ObservableList<Node> content = ((Group)scene.getRoot()).getChildren();content.add(lighting());stage.setScene(scene);    }static Node lighting() {Distant light = new Distant();light.setAzimuth(-135.0f);Lighting l = new Lighting();l.setLight(light);l.setSurfaceScale(5.0f);Text t = new Text();t.setText("JavaFX"+"\n"+"Lighting!");t.setFill(Color.RED);t.setFont(Font.font("null", FontWeight.BOLD, 70));t.setX(10.0f);t.setY(10.0f);t.setTextOrigin(VPos.TOP);t.setEffect(l);t.setTranslateX(0);t.setTranslateY(320);return t;}public static void main(String[] args) {Application.launch(args);}
}

透视效果

透视效果创建了二维对象的三维效果。

透视效果如图5-10所示。

图5-10透视效果

透视变换可以将任何正方形映射到另一个正方形,同时保持线条的直线度。与仿射变换不同,源中的行的并行性不一定保留在输出中。

注意:

此效果不会调整输入事件的坐标或测量节点上的包含的任何方法。如果将透视效果应用于节点,则鼠标单击和包含方法未定义。

示例5-10是示例应用程序中的代码片段,显示了如何创建透视效果。

例5-10透视效果

static Node perspective() {Group g = new Group();PerspectiveTransform pt = new PerspectiveTransform();pt.setUlx(10.0f);pt.setUly(10.0f);pt.setUrx(210.0f);pt.setUry(40.0f);pt.setLrx(210.0f);pt.setLry(60.0f);pt.setLlx(10.0f);pt.setLly(90.0f);g.setEffect(pt);g.setCache(true);Rectangle r = new Rectangle();r.setX(10.0f);r.setY(10.0f);r.setWidth(280.0f);r.setHeight(80.0f);r.setFill(Color.DARKBLUE);Text t = new Text();t.setX(20.0f);t.setY(65.0f);t.setText("Perspective");t.setFill(Color.RED);t.setFont(Font.font("null", FontWeight.BOLD, 36));g.getChildren().add(r);g.getChildren().add(t);return g;}

图5-11显示了哪些坐标会影响生成的图像。

图5-11透视效果的坐标


 

创建一系列效果

某些效果具有可用于创建效果链的输入属性。效果链可以是树状结构,因为一些效果有两个输入而一些没有任何输入。

在图5-12中,反射效果用作投影效果的输入,这意味着首先由反射效果反射矩形,然后将阴影效果应用于结果。

图5-12阴影和反射

例5-11带阴影和反射顺序应用的矩形

import javafx.application.Application;
import javafx.collections.ObservableList;
import javafx.scene.*;
import javafx.stage.*;
import javafx.scene.shape.*;
import javafx.scene.effect.*;
import javafx.scene.paint.*;
import javafx.scene.text.*;public class HelloEffects extends Application {Stage stage;Scene scene;@Override public void start(Stage stage) {stage.show();scene = new Scene(new Group());ObservableList<Node> content = ((Group)scene.getRoot()).getChildren();content.add(chainEffects());stage.setScene(scene);}static Node chainEffects() {Rectangle rect = new Rectangle();rect.setFill(Color.RED);rect.setWidth(200);rect.setHeight(100);rect.setX(20.0f);rect.setY(20.0f);DropShadow ds = new DropShadow();ds.setOffsetY(5.0);ds.setOffsetX(5.0);ds.setColor(Color.GRAY);Reflection reflection = new Reflection();ds.setInput(reflection);    rect.setEffect(ds);return rect;}public static void main(String[] args) {Application.launch(args);}
}

注意:

如果将chainEffects()方法中的最后两行更改为reflection.setInput(ds);rect.setEffect(reflection);,则首先将阴影应用于矩形,然后结果将反射效果反映出来。

有关特定类,方法或其他功能的更多信息,请参阅API文档。

应用文件

NetBeans项目 

  • visual_effects.zip

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/325158.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

《走遍中国》珍藏版(二)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");大门两侧傲…

单表查询

最简单的查询语句 select * from dept select * from emp; – 显示部分列 select empno,ename,sal ,comm,deptno from emp – 显示部分行 where select empno,ename,sal ,comm,deptno from emp where sal<2500 – 别名 select empno 编号,ename 姓名,sal 工资 ,comm 补助…

ssl1072-砝码称重【dp练习】

Description 设有1g、2g、3g、5g、10g、20g的砝码各若干枚&#xff08;其总重<1000&#xff09;&#xff0c; 要求&#xff1a; 输入方式&#xff1a;a1 a2 a3 a4 a5 a6 &#xff08;表示1g砝码有a1个&#xff0c;2g砝码有a2个&#xff0c;…&#xff0c;20g砝码有a6个&…

java中遍历树形菜单,你可能不知道还有这样的方法

版权声明&#xff1a;本文为CSDN博主「穆雄雄」的原创文章&#xff0c;遵循CC 4.0 BY-SA版权协议&#xff0c;转载请附上原文出处链接及本声明。原文链接&#xff1a;https://blog.csdn.net/qq_34137397/article/details/72654955穆雄雄开发工具&#xff1a;MyEclipse 10.5后台…

Docker-Compose 一键部署Ningx+.Net Core+Redis集群

在看该文章前&#xff0c;你需要对Docker有所了解。 1、创建WebApp应用程序 我使用的是.Net Core 1.0.1版本&#xff0c;创建一个MVC应用程序&#xff0c;并添加对Redis的引用。因为这些很基础&#xff0c;也很简单&#xff0c;这里就不详细说明了&#xff0c;特别提一下有关多…

JavaFX官方教程(十四)之转换,动画和视觉效果教程的源代码

翻译自 转换&#xff0c;动画和视觉效果教程的源代码 下表列出了本文档中的演示应用程序及其关联的源代码文件。 教程源代码NetBeans项目文件 转换概述 Xylophone.java transformations.zip 动画基础知识 animations.zip 树动画示例 tree_animation.zip 创建视觉效…

ssl2294-打包【dp练习】

Description 你现在拿到了许多的礼物&#xff0c;你要把这些礼物放进袋子里。你只有一个最多装下V 体积物品的袋子&#xff0c;你不能全部放进去。你也拿不动那么重的东西。你估计你能拿的最大重量为 G。现在你了解了每一个物品的完美值、重量和体积&#xff0c;你当然想让袋子…

《走遍中国》珍藏版(三)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");长廊的油漆…

Catalog Service - 解析微软微服务架构eShopOnContainers(三)

上一篇我们说了Identity Service&#xff0c;因为其基于IdentityServer4开发的&#xff0c;所以知识点不是很多&#xff0c;今天我们来看下Catalog Service&#xff0c;今后的讲解都会把不同的、重点的拿出来讲&#xff0c;希望大家明白。 源码分析 我们先看下它的目录结构&a…

JavaFX官方教程(十五)之A Xylophone.java

翻译自 Xylophone.java 一个 Xylophone.java 有关说明&#xff0c;请参阅转换类型和示例。 法律条款和版权声明 / **版权所有&#xff08;c&#xff09;2010,2014&#xff0c;Oracle和/或其附属公司。* 版权所有。使用须遵守许可条款。**此文件可通过以下许可证获得并获得许…

索引,事务,视图

索引 此时是要获取所有的数据&#xff0c;是否有索引作用不大 select * from emp – 因为数据库以及自动的给主键列empno创建了索引&#xff0c;查询条件中出现empno&#xff0c;自动使用索引进行查询 – 是否使用索引&#xff0c;语句没有区别 select * from emp where empno…

配置环境变量 path

原理 根据windows系统在查找可执行程序的原理&#xff0c;可以将java工具所在路径定义到path 环境变量中&#xff0c;让系统帮我们去找运行执行的程序。 配置方法 我的电脑–属性–高级系统设置–环境变量 编辑 path 环境变量&#xff0c;在变量值开始处加上java工具所在目录…

ssl2863-石子合并【dp练习】

Description 在一个操场上一排地摆放着N堆石子。现要将石子有次序地合并成一堆。规定每次只能选相邻的2堆石子合并成新的一堆&#xff0c;并将新的一堆石子数记为该次合并的得分。请设计一个程序&#xff0c;计算出将N堆石子合并成一堆的最小得分。 Input 每组数据第1行为一个…

《走遍中国》珍藏版(四)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");游走其中&a…

前端框架选型

前面的话 有一个流传较广的笑话&#xff0c;一个人在stackoverflow中提了一个问题&#xff0c;如何使用javascript实现一个数字与另外一个数字相加。最高票回答是你应该使用jQuery插件&#xff0c;jQuery插件可以做任何事情。 历史总是在重演&#xff0c;以前是jQuery&#xff…

JavaFX UI控件教程(一)之简述

翻译自 JavaFX UI控件概述 关于本教程 本教程介绍JavaFX API中提供的内置JavaFX UI控件。 该文件包含以下章节&#xff1a; JavaFX UI控件 标签 按钮 单选按钮 切换按钮 复选框 选择框 文本域 密码框 滚动条 滚动面板 列表视图 表视图 树视图 组合框 分隔器…

断言、触发器、存储过程

断言 assertion 设置每一门课程最多有60人选修 create assertion a check (60 > all ( select count(*) from sc group by cno) ); drop assertion a; 触发器 trigger 删除触发器 drop tigger a on student 存储过程 定义一个没有返回值的存储过程 create procedure my…

《走遍中国》珍藏版(五)

Console.WriteLine("上一本书已经看完&#xff0c;从今天开始看下一本"); System.out.println("《走遍中国》珍藏版"); System.out.println("这本书是关于地理的"); System.out.println("地理往往是和历史进行紧密联系的");陕西&#…

ssl1007 and ssl -最大乘积 and 加法最大【区间dp练习】

Description   今年是国际数学联盟确定的“2000——世界数学年”&#xff0c;又恰逢我国著名数学家华罗庚先生诞辰90周年。在华罗庚先生的家乡江苏金坛&#xff0c;组织了一场别开生面的数学智力竞赛的活动&#xff0c;你的一个好朋友XZ也有幸得以参加。活动中&#xff0c;主…

一个java源文件中可以声明多少个class与编译后会生成多少个字节码文件

在一个java源文件中可以声明多个class。 但是&#xff0c;只能最多有一个类声明为public的。 而且要求声明为public的类的类名必须与源文件名相同。 编译的过程 编译以后&#xff0c;会生成一个或多个字节码文件。字节码文件的文件名与java源文件中的类名相同。 运行 只能运…