QML 中的缩放(2):像素

本文参考文章:In Pixels we trust, Scalable UIs In QML part 2.,感谢原文作者的贡献。

上一篇,我们谈到了扩展的难度在于扩展当前我们已经应用于移动和嵌入式设备的 PPI 范围。我们还提到了避免这个问题的最常见的方法是通过提供几种不同分辨率下的图像资源来帮助缓解这个问题。

它是如何工作的?我们又如何在 QML 中进行实现呢?更重要的是它是否存在问题?这是最好的解决方案么?它权衡了哪些利弊?

图标

图标是一个比较容易入手的点,图标在移动设备诞生之前就被我们进行缩放,这与我们现在在移动设备上进行的缩放非常类似。平台的图标尺寸通常是2的倍数,它一般是像16x16, 24×24, 32×32, 48×48, 64×64, 96×96, 128×128,172×172, 256×256, 512×152… 这样类似。所有这些尺寸的原因有很多,包括营销、具体使用、类型、可点击区域和可见性等。但你可能会问,如何会这么多,我们怎么不只是使用一个大小?

为了回答这个问题,我们首先需要了解像素和缩放效果。

什么是像素?

英文为Pixel,又叫Picture element。数字图象是由按一定间隔排列的亮度不同的像点构成的,形成像点的单位称“像素”,也就是说,组成图象的最小单位是像素,像素是图象的最小因素。从计算机技术的角度来解释,像素是硬件和软件所能控制的最小单位。它指显示屏的画面上表示出来的最小单位,不是图画上的最小单位。像素是在影像感应器上将光信号转变成电信号的基本工作单位,以 CMOS 感应器的像素为例,它包含了一个光电二极管,用来产生与入射光成比例的电荷,同时它也包含了其他一些电子元件,以提供缓存转换和复位功能。当每个像素上的电容所积累的电荷达到一定数量并被传送给信号放大器再通过数模转换之后,所拍摄影像的原始信号才得以真正显现,而具有这些全部功能的器件才能称为是一个真正的影像感应器。比如,一台数码相机的最高分辨率为3264×2448,意味着它拥有的影像感应器会有7990272个像素点。该段文字参考什么是像素

缩放是如何实现的?

缩放可以通过多个智能或非智能算法完成,但通常是新渲染网格中像素插值的结果。 结果是当像素被拉伸时,它被分布在新的像素网格上。

关于图标的一些事项

图标是使用像素网格充分发挥其潜力的特殊图像。我们仍然以像素绘制图标,即使它们实际是在矢量绘图应用程序中完成的。我们仍然将我们的矢量与虚拟渲染网格对齐,我们这样做可以最大限度地提高对比度和锐度,因此图标往往会大量的使用垂直和水平的对比度。
缩放图标会导致模糊图像,因为这些像素对比度在内插过程中会变得模糊,如果对比线在主要的16×16网格线上完成,则只能处理多个值。即使在那里我们失去了有意义的数据,作为1像素宽的对比度成为0.5或0.25的子像素。
因此,当我们进行图像处理时,每个图标都会针对每个尺寸进行重做,我们绝对不会将图标从一个大小缩放到另一个尺寸...

图标缩放效果

您可以在图像中看到,将图标缩放1像素可能会导致非常模糊的结果。 我的建议是,如果您需要不同尺寸的图标,每英寸不同的像素看起来相同,那么您应该提供多个图像,使用2x和1之间的缩放因子,并重新绘制图标,以利用额外的像素。

Android 期望的图标

再以 Android 平台为例:
为了创建不同密度的图标,您应该遵循五个主要密度(分别为: medium, high, x-high, xx-high, and xxx-high)之间的2:3:4:6:8缩放比例。例如,考虑将启动器图标的大小指定为48×48 dp。 这意味着基准线(MDPI)的 asset 为 48×48 像素,high 密度(HDPI)asset 应为基准线的1.5倍即 72×72 像素,x-high 密度(XHDPI)asset 应为基准线的两倍即 96×96 像素,等等。

Android 期望的图标尺寸示例

按钮和其他 X/Y 独立的可扩展元素

应该以独立于 X/Y 的方式扩展的 UI 元素,如Buttons、GroupBoxes和其他自定义的基于图像的元素。他们如何工作?
在QML中,我们有一个由这些元素构成的组件,例如 BorderImage,它可以将图像分割成 9 部分,所以它可以适当的方式缩放/平铺每一个图像。

BorderImage {
   id: scalableElement
   source: "./image/Imagebase.png"
   width: 100; height: 100
   border.left: 25; border.top: 25
   border.right: 25; border.bottom: 25
}

上面的代码,通过对 Imagebase.png 的图像指定 25 像素的四个边距,从而达到不缩放图片的四个角,仅仅拉伸这 25 像素边距之外的区域来创建了一个 100X100 像素的元素。

BorderImage 缩放示意图

现在的主要问题是什么? 应该有多大? 用什么度量?

如果它在触摸屏上使用,那么它应该足够大,您可以触摸它,而不会导致误触,足够大应该是是7到9毫米之间,这也取决于用户可以容忍度。这个数字粗略地说明你的拇指与触摸屏的接触面的大小。

这意味着我们在这里有两个矛盾的指标,一方面我们有像素,在另一个物理尺寸上,我们仍然以像素表示 QML 代码的值,但是我们需要使这个元素大小符合我们的拇指的大小。

PPI 还是 DPI ?

PPI或DPI是屏幕一英寸的像素数量,我们可以通过多种方法将 PPI 显示给 QML,但是我们希望的是真正的 PPI 而不是逻辑的。如果你是一个“像素狂魔”,你可能需要 PPIx 和 PPIy —— 它们使得像素不再总是真的“正方形”的。

示例

将这个理论应用到之前的代码上,我们可以有如下的代码:

....
property int dpi: Screen.pixelDensity*25.4 
....
BorderImage {
   id: scalableElement2
   source: "./image/Imagebase.png"
   width: 1.5*dpi; height: 0.36*dpi
   border.left: 25; border.top: 25
   border.right: 25; border.bottom: 25
}

该代码展示了我们将使用最常用的方法,ppi 或 dpi作为主要指标。无论我们使用什么屏幕,它都将创建一个1.5英寸长的0.36英寸高的按钮。然而,在多个屏幕上它看起来仍然会不一样,拐角处的曲率可能会随着 PPI 的增长而下降,同时阴影也将变得越来越不可见。所以我们需要引入一个我们为图标准备的类似的解决方案,我们可以使用多个 BaseImage 为多个可能的 PPI 范围。在我的下一篇博客文章中,我将尝试展示如何以不是太丑陋的方式来完成这一目标。我们还将讨论这种方法的局限性……QML 中的缩放(3):BorderImage

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 204,684评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,143评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,214评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,788评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,796评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,665评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,027评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,679评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 41,346评论 1 299
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,664评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,766评论 1 331
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,412评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,015评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,974评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,203评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,073评论 2 350
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,501评论 2 343

推荐阅读更多精彩内容