JavaFX技巧31:遮罩/剪切/ Alpha通道

选择条

最近,我不得不实现一个自定义控件,该控件使用户可以从项目列表中选择一个项目。 此“ SelectionStrip”控件必须水平放置项目,并且在项目过多的情况下,允许用户左右水平滚动。 该控件将在空间受限的区域中使用,因此仅在需要时才显示滚动按钮。 显示时它们也不应浪费任何额外的空间。 因此,我决定将它们放置在控件左侧和右侧的顶部。 所有这些都很容易实现,只是现在很难区分滚动按钮和项目。 可以在下面的三个图像中看到。

阿尔法频道?

因此,我认为在靠近左侧或右侧边缘时以某种方式淡出项目会很好。 这种行为通常可以通过使用alpha通道来完成。 随着像素到边缘的距离减小,可能会降低像素的不透明度。 好的.....但是在JavaFX中如何完成呢? 在相当长的一段时间里,我一直在研究各种“混合模式”,这些模式可用于定义如何在彼此重叠的位置绘制两个重叠的节点。 但是,这是错误的方向。 事实证明,我已经知道该怎么做,因为我曾经写过一篇博客文章,内容涉及剪辑以及填充和未填充剪辑之间的区别 。 但是我想这太早了,我没有在“填充”和“不透明度小于1”之间建立联系。

复杂剪辑!

到目前为止,我用于自定义控件的大多数剪辑都是简单的矩形。 他们通常确保到达其父控件的布局范围之外的子节点不可见或仅部分可见。 但是此剪辑不同,它更加复杂。 它必须定义三个不同的区域。 左侧为“淡入”区域,中央为“完全不透明”区域,右侧为“淡入”区域。 为此,我定义了一个“组”,它由三个填充的“矩形”节点组成。 中心矩形的填充颜色为纯黑色,而其他两个矩形的填充颜色为从透明到黑色的线性渐变,反之亦然。 下图说明了这一点。

阿尔法频道

通过此设置,我们现在可以将任何节点作为子节点添加到堆栈窗格中,并且将在其侧面用淡入和淡出效果进行绘制。

结果

从一开始就将滚动箭头/按钮应用于“ SelectionStrip”控件后,它现在始终清晰可见,并且总体用户体验更加令人满意。 这些小细节使被认为是“学生项目”或“商业应用程序”的UI有所不同。 因此,有时值得在这些上投入时间。

源代码

我将屏蔽逻辑放入了一个称为“ MaskedView”的自定义控件中。 在本文的底部,您将看到包含此​​控件源代码的Gist(或Gist链接)。 可以将其视为给定内容节点周围的包装器。

import javafx.beans.property.DoubleProperty;
import javafx.beans.property.SimpleDoubleProperty;
import javafx.beans.property.SimpleObjectProperty;
import javafx.scene.Node;
import javafx.scene.control.Control;
import javafx.scene.control.Skin;public class MaskedView extends Control {public MaskedView(Node content) {setContent(content);}@Overrideprotected Skin<?> createDefaultSkin() {return new MaskedViewSkin(this);}private final SimpleObjectProperty<Node> content = new SimpleObjectProperty<>(this, "content");public final Node getContent() {return content.get();}public final SimpleObjectProperty<Node> contentProperty() {return content;}public final void setContent(Node content) {this.content.set(content);}private final DoubleProperty fadingSize = new SimpleDoubleProperty(this, "fadingSize", 120);public final double getFadingSize() {return fadingSize.get();}public final DoubleProperty fadingSizeProperty() {return fadingSize;}public final void setFadingSize(double fadingSize) {this.fadingSize.set(fadingSize);}
}
import javafx.beans.InvalidationListener;
import javafx.beans.WeakInvalidationListener;
import javafx.scene.Group;
import javafx.scene.Node;
import javafx.scene.control.SkinBase;
import javafx.scene.layout.StackPane;
import javafx.scene.paint.Color;
import javafx.scene.paint.CycleMethod;
import javafx.scene.paint.LinearGradient;
import javafx.scene.paint.Stop;
import javafx.scene.shape.Rectangle;public class MaskedViewSkin extends SkinBase {private final Rectangle leftClip;private final Rectangle rightClip;private final Rectangle centerClip;private final Group group;private final StackPane stackPane;public MaskedViewSkin(MaskedView view) {super(view);leftClip = new Rectangle();rightClip = new Rectangle();centerClip = new Rectangle();centerClip.setFill(Color.BLACK);leftClip.setManaged(false);centerClip.setManaged(false);rightClip.setManaged(false);group = new Group(leftClip, centerClip, rightClip);stackPane = new StackPane();stackPane.setManaged(false);stackPane.setClip(group);getChildren().add(stackPane);view.contentProperty().addListener((observable, oldContent, newContent) -> buildView(oldContent, newContent));buildView(null, view.getContent());view.widthProperty().addListener(it -> updateClip());view.fadingSizeProperty().addListener(it -> updateClip());}private final InvalidationListener translateXListener = it -> updateClip();private final WeakInvalidationListener weakTranslateXListener = new WeakInvalidationListener(translateXListener);private void buildView(Node oldContent, Node newContent) {if (oldContent != null) {stackPane.getChildren().clear();oldContent.translateXProperty().removeListener(weakTranslateXListener);}if (newContent != null) {stackPane.getChildren().setAll(newContent);newContent.translateXProperty().addListener(weakTranslateXListener);}updateClip();}private void updateClip() {final MaskedView view = getSkinnable();Node content = view.getContent();if (content != null) {final double fadingSize = view.getFadingSize();if (content.getTranslateX() < 0) { leftClip.setFill(new LinearGradient(0, 0, fadingSize, 0, false, CycleMethod.NO_CYCLE, new Stop(0, Color.TRANSPARENT), new Stop(1, Color.BLACK))); } else { leftClip.setFill(Color.BLACK); } if (content.getTranslateX() + content.prefWidth(-1) > view.getWidth()) {rightClip.setFill(new LinearGradient(0, 0, fadingSize, 0, false, CycleMethod.NO_CYCLE, new Stop(0, Color.BLACK), new Stop(1, Color.TRANSPARENT)));} else {rightClip.setFill(Color.BLACK);}}view.requestLayout();}@Overrideprotected void layoutChildren(double contentX, double contentY, double contentWidth, double contentHeight) {final double fadingSize = Math.min(contentWidth / 2, getSkinnable().getFadingSize());stackPane.resizeRelocate(snapPosition(contentX), snapPosition(contentY), snapSpace(contentWidth), snapSpace(contentHeight));resizeRelocate(leftClip, snapPosition(contentX), snapPosition(contentY), snapSpace(fadingSize), snapSpace(contentHeight));resizeRelocate(centerClip, snapPosition(contentX + fadingSize), snapPosition(contentY), snapSpace(contentWidth - 2 * fadingSize), snapSpace(contentHeight));resizeRelocate(rightClip, snapPosition(contentX + contentWidth - fadingSize), snapPosition(contentY), snapSpace(fadingSize), snapSpace(contentHeight));}private void resizeRelocate(Rectangle rect, double x, double y, double w, double h) {rect.setLayoutX(x);rect.setLayoutY(y);rect.setWidth(w);rect.setHeight(h);}
}

希望您能找到此控件的好用例。

祝大家编码愉快!

翻译自: https://www.javacodegeeks.com/2018/07/javafx-tip-31-masking-clipping-alpha-channel.html

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

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

相关文章

【渝粤题库】陕西师范大学200831 编译原理 作业

一、填空 1、预测分析方法LL&#xff08;1&#xff09;方法&#xff0c;它由一个栈&#xff0c;一个 和一个 组成。其中构造 是该分析方法的关键。 2、下面图 是一个DFA&#xff0c;而图 是一个NFA 3、词法分析器的任务是对 进行扫描&#xff0c;以 为依据识别出一个个单词符号…

通信中的频谱效率与能量效率

频谱效率(Spectral Efficiency) 频谱效率&#xff08;Spectral Efficiency&#xff0c;SE&#xff09;简称谱效&#xff0c;也称系统容量、频带利用率。 该指标用来衡量系统的有效性&#xff0c;描述了能够提供多少容量。 它定义为系统传输的有效信息速率R除以通信信道带宽B&a…

【渝粤题库】陕西师范大学201491 法学导论作业

《法学导论》作业 一、单项选择题 1&#xff0e;西方法学发展史上&#xff0c;著名法学家著作即学理法开始成为法律制度重要组成部分的是( ) A 古希腊 B古罗马 C近代 D现代 2&#xff0e;17-18世纪出现的资产阶级法权世界观的典型代表是( ) A 自然法学派 B历史法学派 C…

【渝粤题库】陕西师范大学201951 明清小说史 作业

单选题 1&#xff0e;将朝代兴替&#xff0c;争霸天下的题材组织成的长篇章回小说称作&#xff08; &#xff09; A、说铁骑 B、英雄传奇 C、历史演义 D、世情小说 2&#xff0e;以下见于《水浒传》的故事有&#xff08; &#xff09; A、智取生辰纲 B、火烧博望坡 C、弄权铁槛…

积分公式大全

https://kexue.fm/sci/integral/ 《积分公式大全》网络版本——By BoJone 引用原作者的话&#xff1a; 本附件所有公式来自《高等数学第三版》。   该书信息&#xff1a;同济大学数学教研室编&#xff0c;高等教育出版社&#xff0c;1988年4月第三版&#xff0c;ISBN 7-04-0…

注释嵌套注释_注释梦Night

注释嵌套注释XmlElementWrapper(name"orders") XmlJavaTypeAdapter(OrderJaxbAdapter.class) XmlElements({XmlElement(name"order_2",typeOrder2.class),XmlElement(name"old_order",typeOldOrder.class) }) JsonIgnore JsonProperty NotNull M…

【渝粤题库】国家开放大学2021春2312旅行社经营管理题目

试卷代号&#xff1a;2312 2021年春季学期期末统一考试 旅行社经营管理 试题 2021年7月 一、单项选择题&#xff08;下列各题选项中只有一个答案是最准确的&#xff0c;请将其序号埴入括号中&#xff0c;每小题2分.共20分&#xff09; 1.旅行社的( )是旅行社经营的基础&#xf…

Latex快速入门系列 -- 在TexStudio中正确插入参考文献的基本操作

目录 1 操作流程2 四种基本的文献格式比较3 文献数据库.bib的编写 1. 操作流程 1.1 创建文章主文件。Ctrl N 新建一个文件&#xff0c;Ctrl S 手动保存&#xff0c;保持文件后缀名.tex。得到一个.tex文件&#xff1a;文章名.tex&#xff0c;该文件用来编写你的文章的具体内…

【渝粤题库】国家开放大学2021春2509学前教育学题目

试卷代号&#xff1a;2509 2021年春季学期期末统一考试 学前教育学 试题 2021年7月 一、选择题&#xff08;每小题2分&#xff0c;共20分&#xff09; 1.瑞士教育家裴斯泰洛齐的代表作是( )。 A.《大教学论》 B.《世界图解》 C.《理想国》 D.《林哈德与葛笃德》 2.学前教育阻碍…

MongoDB索引策略和索引类型

1. MongoDB索引策略和索引类型–简介 MongoDB是一个开放源代码&#xff0c;面向文档的跨平台数据库&#xff0c;它使用C 开发&#xff0c;并且是最流行和使用最广泛的NoSQL类型数据库之一。 它可在具有键-值对的类JSON文档的顶部运行&#xff0c;其键值对在每个文档中都无法定义…

【渝粤题库】国家开放大学2021春2634推销策略与艺术题目

试卷代号&#xff1a;2634 2021年春季学期期末统一考试 推销策略与艺术 试题 2021年7月 一、单项选择&#xff08;在每小题的4个选项中选出一个最优的&#xff0c;将其序号填入题后括号内。每小题2分&#xff0c;共20分&#xff09; 1.在现代推销中&#xff0c;推销人员应该持有…

prove, verify, bear out, demonstrate, confirm, validate, testify, certify 的区别

1. prove prove “证明”&#xff0c;证明&#xff08;某事属实&#xff09;, 普通用词&#xff0c;泛指有充分的、可靠的事实证明某一观点或结论是正确的。可用作及物动词&#xff0c;后接宾语或宾语从句。 Galileo proved the law of falling objects to the world from the…

zeal刷新不出来_推进重涂市场标准化,立邦率先推出刷新服务“八大验收标准”...

点击蓝字【立邦中国】&#xff0c;设置星标关注。7月&#xff0c;立邦刷新服务率先在墙面重涂行业提出突破性的“八大验收标准”&#xff0c;根据不同的涂刷工艺来采用定制化的验收标准&#xff0c;更进一步推动重涂市场的标准化和规范化。自2011年推出立邦刷新服务至今&#x…

【渝粤题库】国家开放大学2021春2732土地利用规划题目

试卷代号&#xff1a;2732 2021年春季学期期末统一考试 土地利用规划 试题 2021年7月 一、单选题&#xff08;每小题3分&#xff0c;10小题&#xff0c;共30分&#xff09; 1.从生态角度看&#xff0c;土地不具有( )功能。 A.支撑 B.养育 C.净化 D.生产 2.土壤腐殖质的热容量比…

初学者指南:如何为Red Hat Process Automation Manager配置电子邮件服务任务

最近&#xff0c;我一直在更新我的免费在线研讨会 &#xff0c;特别是基于JBoss BPM Suite的系列研讨会 &#xff0c;以便您可以开始使用较新的Red Hat Process Automation Manager 。 在本文中&#xff0c;我将分享我在自动化项目中尝试使用电子邮件通知时偶然发现的内容。 …

【渝粤题库】国家开放大学2021春2786初级西方经济学题目

试卷代号&#xff1a;2786 2021年春季学期期末统一考试 初级西方经济学 试题 2021年7月 一、单项选择题&#xff08;在下列各题的备选答案中选择一个正确的&#xff0c;并将其序号字母填入题后的括号里。每题2分&#xff0c;共30分&#xff09; 1.如果某种商品缺乏弹性&#xf…

TDMA 时分多路复用

多路复用 一、什么是多路复用技术&#xff1f; 多路复用技术是把若干个低速信道组成一个高速信道的技术&#xff0c;可以提高数据链路利用率&#xff0c;从而使一条高速的主干链路同时为多条低速的接入链路提供服务&#xff0c;即使网络主干链路可同时运载大量的语音和数据传…

asp 取数据 计算_ASP.NET Core 简介

.NET Core 是 .NET Framework 的新一代版本&#xff0c;是微软开发的第一个具有跨平台 ( Windows、Mac OSX 、Linux ) 能力的应用程序开发框http://ASP.NET Core 是 Microsoft 新开发的&#xff0c;基于 .NET Core 的 Web 开发框架http://ASP.NET Core 是对 http://ASP.NET 的重…

【渝粤题库】国家开放大学2021春3922汽车运用基础题目

试卷代号&#xff1a;3922 2021年春季学期期末统一考试 汽车运用基础 试题 2021年7月 一、单项选择题&#xff08;下列各题的备选答案中&#xff0c;只有一个选项是正确的&#xff0c;请把正确答案的序号填写在括号内。15小题&#xff0c;每小题2分&#xff0c;共30分&#xff…

java字节码_掌握Java字节码

java字节码嘿! Happy Advent&#xff1a;D我是ZeroTurnaround的技术布道者Simon Maple&#xff08; sjmaple&#xff09; 。 您知道&#xff0c; JRebel伙计们&#xff01; 由于编写了类似JRebel的产品&#xff0c;该产品与字节码进行交互的结果比您想像中的要多&#xff0c;因…