JavaFX 中的像素、分辨率与缩放比
JavaFX 中的像素、分辨率与缩放比
- 总结与补充
JavaFX 中,一般需要对每个组件设置一个尺寸值,这个值实际上就是像素值(pixel,px)。像素值是什么呢?在 Windows 上,一般使用任意截图软件进行截图选定区域后,在左上角就会显示该区域的宽(width)和高(height),这个宽和高的单位就是像素。
不过要注意的问题是,像素有相对值与绝对值之分。这个问题有点复杂,这里详细解释一下。
绝对像素,指的是像素的最终实际值,也就是上面所说的截图软件中显示的值。关于这个值,在 Windows 中将使用两个参数来控制。一个是(显示)分辨率(resolution),另一个是缩放比例(scale)。任何 UI 在屏幕中显示时,最终使用的都是绝对像素值。
关于分辨率和缩放比例,在 Windows 中可以自行设定,方法如下:
相对像素,指的是像素的计算的基准值。上面所说的 JavaFX 组件的尺寸实际上是一个相对像素值。
绝对像素与相对像素之间有什么联系呢?绝对像素需要通过相对像素与缩放比例来算得。而显示器的分辨率将给出显示器的绝对像素值,也就是显示器右下角相对于左上角的绝对像素坐标。以笔者上面图片的中的为例,当分辨率为 1920 × 1080
、缩放比例为 125%
时:
显示器右下角的绝对像素坐标为:
width:1920
height:1080
显示器右下角的相对像素坐标为:
width:1920 / 1.25 = 1536
height:1080 / 1.25 = 864
屏幕中任意一点的绝对像素坐标为:
(其中,(x, y) 为该点的相对对像素坐标。α 为屏幕的缩放比。)
width:x * α
height:y * α
【提示】
在 Java 中,有很多方式可以实现绝对像素与相对像素之间的转化。例如,在 JavaFX 中,可以使用如下方法分别获取宽和高的缩放比:
double scaleX = Screen.getPrimary().getOutputScaleX(); double scaleY = Screen.getPrimary().getOutputScaleY();
还可以使用虚拟机参数
-Dprism.allowhidpi = XXX
,来决定 JavaFX 是否采纳系统的缩放比。如果将此处的XXX
设为 false,这相当于将系统的缩放比设为了 1。此虚拟机参数也可以在 Java 程序中指定,如下。不过,必须要在初始化 UI 程序之前设置才会生效。System.setProperty("prism.allowhidpi", "XXX"); // 其中,XXX 在实际的环境下应改为 true 或 false
不过,程序不应该过分依赖此设置。由于此设置对整个 UI 界面都会起作用,所以不建议使用此设置来控制 UI 的行为。应该使用前面的方法获取缩放比来决定 UI 应该如何显示。
很多应用都在设置提供了一种
适配系统缩放比例
的选项。这实际上就是决定系统的缩放比会不会生效。不生效指的是将缩放比视为 1。这个设置通常需要应用重启才会起作用。在 JavaFX 中,可以使用上述的方法来实现这个功能。
绝对像素与相对像素以哪个为准比较好呢?不能一概而论。有些时候应该以绝对像素为准,有些时候应该以相对像素为准,有些时候无关紧要。由于 UI 在屏幕中显示时,最终使用的都是绝对像素值。所以这个问题就是考虑在编程中该以什么值来表示屏幕中的绝对像素。
如果是以绝对像素为准(在代码、测量统计时的数据中直接使用绝对像素),就要求 UI 在各种环境下的界面尺寸都保持一致。有时候,光是考虑绝对像素也不能做到这一点,还要结合设备的型号和显示器尺寸作调节。因为显示屏的 DPI 可以通过调整分辨率来改变。但这会使用软件失去屏幕适配的能力,一般不会使用这种方法,因此 JavaFX 也没有采用。
如果是以相对像素为准,就要求 UI 组件间的比例保持一致,而实际的大小无关紧要。
如果希望 UI 组件可以自动调整大小与间距,则使用哪个无关紧要。
总结与补充
在 JavaFX 中,传入组件的像素值一般是相对像素,而直接从屏幕中获取的像素是绝对像素。它们之间需要借助缩放比来进行转化。
截图软件上显示的是绝对坐标。
如果使用与屏幕坐标的相关 API 时,发现传入的坐标与实际生效的坐标差异很大,这说明此 API 可能使用的是相对坐标。请尝试将此坐标除以
屏幕缩放比
再进行传入。
JavaFX 中的像素、分辨率与缩放比相关推荐
- 在 JavaFX 中,如何计算文本所占像素的宽度
在 JavaFX 中,如何计算文本所占像素的宽度 注意事项 算法 代码 计算单行文本的像素宽度 计算文本框尺寸 JavaFX 的恼人之处在于很多基本的操作都要自己亲力亲为.有些时候,我们希望 Te ...
- ppt中的图片批量保存的方法(及像素分辨率换算)
针对2010,将后缀名.pptx改成.zip,然后解压,就得到一个文件夹,在里面子文件夹里的media里是每个图片单独保存的tif格式.目测分辨率和每个单独保存分辨力一样. 转自:http://www ...
- 双三次插值图像旋转_4K/8K电视中的超分辨率技术到底是啥?让我来告诉你(二-插值篇)...
昨天的文章中,写了在4K/8K电视中的超分辨率算法究竟是什么,它的应用场景有哪些以及现在常用的超分辨率算法有哪几大类,如有不清楚的,可以翻看昨天的文章,今天书接上文,具体来聊一聊三类超分辨率算法中的第 ...
- CVPR | 旷视提出Meta-SR:单一模型实现超分辨率任意缩放因子
点上方蓝字计算机视觉联盟获取更多干货 在右上方 ··· 设为星标 ★,与你不见不散 编辑:Sophia 计算机视觉联盟 报道 | 公众号 CVLianMeng 转载于 :旷视 [人工智能资源(书籍 ...
- 一个初级前端结合css、div谈一谈屏幕尺寸、分辨率、缩放概念题
写在前面: 本文作为本人学习总结之用,同时分享给大家~ 个人前端博客网站:https://zhangqiang.hk.cn 欢迎加入博主的前端学习qq交流群::706947563,专注前端开发,共同学 ...
- 解决电脑分辨率及缩放导致页面变形的问题
/*** @description 校正windows页面在系统进行缩放后导致页面被放大的问题,通常放大比例是125%.150%* // Vue3 解决电脑分辨率及缩放导致页面变形的问题* **/cl ...
- OpenCV中的超分辨率
文章目录 介绍 OpenCV中的超分辨率 EDSR ESPCN FSRCNN LapSRN 结果 结论 介绍 超分辨率是指放大或改善图像细节的过程.请关注此博客,以了解OpenCV中"超分辨 ...
- JavaFX官方教程(八)之JavaFX中的动画和视觉效果
翻译自 JavaFX中的动画和视觉效果 您可以使用JavaFX快速开发具有丰富用户体验的应用程序.在本入门教程中,您将学习如何使用非常少的编码创建动画对象并获得复杂的效果. 图7-1显示了要创建的应 ...
- JavaFX官方教程(五)之在JavaFX中创建表单
翻译自 在JavaFX中创建表单 在开发应用程序时,创建表单是一项常见活动.本教程将向您介绍屏幕布局的基础知识,如何将控件添加到布局窗格以及如何创建输入事件. 在本教程中,您将使用JavaFX构建如 ...
最新文章
- 修改用友服务器ip地址,用友服务器ip地址更换
- POJ2308连连看dfs+bfs+优化
- 正确设置nginx/php-fpm/apache权限 提高网站安全性 防止被挂木马
- 使用Linux命令来发送信息
- 64位BASM学习随笔(一)
- Apple移动设备处理器指令集 armv6、armv7、armv7s及arm64
- jQuery表单提交
- 方便的Unity真机调试工具:LogViewer
- 2011-2017年中国各地政府BIM相关标准政策汇总
- iOS学习之系统历史版本概览
- 进入web端进行来源判断后 自动跳转至wap端页面
- 微信小程序学习日记6
- [SystemVerilog] 基于 FPGA 的数字钟设计
- Excel从手机号和座机号混合文本中提取手机号码
- 图标(ico,cur)文件的结构解析
- django项目中实现excel表数据导入
- css浮动后页面乱了怎样解决,详解浮动元素引起的问题和解决办法
- 仿网易云音乐html代码,仿网易云音乐外链播放器UI的HTML5音乐播放器插件
- mysql避免回文_谈谈回文子串
- 「凤凰网专访」极视角何庆:点亮繁星 赋能百业