(原创)高DPI适配经验系列:(二)按DPI范围适配
一、前言
一个软件,往往会用到位图资源,比如图标、图片、水晶按钮等。
在使用了位图资源后,就不能对任意DPI都进行适配,因为这样适配的代价太大了。
像Win10的缩放比例可以由100%-500%,如果全部适配的话,仅一个图标就是制作401个不同分辨率的版本,时间成本和空间成本上开销都太大了。同时,在很多DPI下,这401个图标当中有很多临近的图标的尺寸变化并不明显,甚至相同,这样无疑是浪费。
所以,我们就需要以DPI范围为基础进行适配。
相信看完的你,一定会有所收获!
本文地址:https://www.cnblogs.com/lesliexin/p/14636355.html
二、DPI计算公式与适配任意分辨率
1,DPI计算公式
在第一篇中,我通过推理和归纳,总结出了DPI与缩放比例间的对应关系。
但其实,DPI与缩放比例之间是有一个计算公式的,如下:
DPI=缩放比例*96
结果取整数,小数位四舍五入。
示例:
缩放比例为150%时,DPI=150%*96=144。
这也是为什么会出两个缩放比例对应同一个分辨率。
112%:DPI=112%*96=107.52,四舍五入后,DPI=108;
113%:DPI=113%*96=108.48,四舍五入后,DPI=108;
2,适配任意分辨率
如果需要适配任意分辨率,那么尺寸就需要等比缩放。根据缩放比例进行计算比例,从100%开始,到500%结束。
同时,因为分辨率是都是整数,所以要对计算后的结果进行四舍五入取整处理。
在前言中,我举了个图标的例子,但实际上因为图标的尺寸很小,一般的图标是16*16,所以真正所需要制作的尺寸并达不到401个。
以16*16分辨率的图标为例:
从上图可以看出,在好多缩放比例下,图标的尺寸都是一样的,所以综合下来并达不到401个,但是也有60+,制作这么多图标,是极其消耗人力的。
三、按DPI范围适配
适配任意DPI是完美的,但是在实际应用中,这种太过耗费时间与精力。
同时,在实现使用过程中,这些细小的变化对实际的使用影响并不大,而且整体界面尺寸的变化也不大。
所以便可以按照“DPI范围”进行适配,不同范围的DPI值对应不同的缩放系数,这也是目前主流的高DPI适配方法。
同时,因为在程序中,我们可以获取到的是DPI信息,而不是缩放信息,所以为了减小计算,是按照DPI去划分范围的,而不是按缩放比例去划分范围的。
在选择适配范围时,有多种范围选择方法。这里提供一种我个人常用的范围分配方法:
优点:
1,适配完目前的100%~500%,每个图标只需要9份即可。
2,缩放系数以0.5递增,方便各种尺寸的计算。特别只要是偶数,计算后就会是整数,省去取整时精度损失。
当然,以目前实际应用而言,300%的缩放已经很极限了,所以在此基础上还可以进一步的简化,以减少工作量。
还可以在低缩放比例下再次细化,以到达更好的用户体验。
四、总结
世间安得双全法,所以大家可以根据自己的实际需要,来制定自己的适配方案。
本文也只是一家之言,欢迎大家评论指正。
-【END】-
(原创)高DPI适配经验系列:(二)按DPI范围适配的更多相关文章
- (原创)高DPI适配经验系列:(四)高DPI适配示例
一.前言 光说不练假把式. 原理说再多,也不如一个例子直观明了.所以本篇文章就来通过一个例子演示一下高DPI适配的流程. 相信看完的你,一定会有所收获! 本文地址:https://www.cnblog ...
- (原创)高DPI适配经验系列:(一)缩放比例与DPI对应关系
一.前言 当下,2K分辨率已成为主流标配,3K.4K也已经广泛应用. 在屏幕尺寸不变的情况下,高分辨率也就意味着高DPI,对于桌面程序而言,除了先天就支持高DPI的框架外(如UWP.Electron等 ...
- (原创)高DPI适配经验系列:(三)字体与字号、缩放锚点
一.前言 程序最基本的元素,就是文本,也就是字体.如果程序未进行高DPI的适配,最直观的感受便是字体的模糊.所以本篇便来说一下高DPI适配中的字体问题. 高DPI的适配,简单来说便是便是根据不同的DP ...
- Redis总结(五)缓存雪崩和缓存穿透等问题 Web API系列(三)统一异常处理 C#总结(一)AutoResetEvent的使用介绍(用AutoResetEvent实现同步) C#总结(二)事件Event 介绍总结 C#总结(三)DataGridView增加全选列 Web API系列(二)接口安全和参数校验 RabbitMQ学习系列(六): RabbitMQ 高可用集群
Redis总结(五)缓存雪崩和缓存穿透等问题 前面讲过一些redis 缓存的使用和数据持久化.感兴趣的朋友可以看看之前的文章,http://www.cnblogs.com/zhangweizhon ...
- [知识库分享系列] 二、.NET(ASP.NET)
最近时间又有了新的想法,当我用新的眼光在整理一些很老的知识库时,发现很多东西都已经过时,或者是很基础很零碎的知识点.如果分享出去大家不看倒好,更担心的是会误人子弟,但为了保证此系列的完整,还是选择分享 ...
- Wireshark入门与进阶系列(二)
摘自http://blog.csdn.net/howeverpf/article/details/40743705 Wireshark入门与进阶系列(二) “君子生非异也,善假于物也”---荀子 本文 ...
- tensorflow笔记(五)之MNIST手写识别系列二
tensorflow笔记(五)之MNIST手写识别系列二 版权声明:本文为博主原创文章,转载请指明转载地址 http://www.cnblogs.com/fydeblog/p/7455233.html ...
- Android-屏幕适配经验总结
本文记录一些适配问题的研究,基础概念不做过多介绍. Android在做屏幕适配的时候一般考虑两个因素:分辨率和dpi.分辨率是屏幕在横向.纵向上的像素点数总和,一般用"宽x高"的形 ...
- Web 前端开发人员和设计师必读文章推荐【系列二十八】
<Web 前端开发精华文章推荐>2014年第7期(总第28期)和大家见面了.梦想天空博客关注 前端开发 技术,分享各类能够提升网站用户体验的优秀 jQuery 插件,展示前沿的 HTML5 ...
随机推荐
- very useful English Acronyms in Programming for Programmer
very useful English Acronyms in Programming for Programmer alias / shorthand / acronyms 别名 / 简写 / 缩略 ...
- Union international inc引进微信线下支付,开启消费无现金时代
长期以来,Union international inc娱乐集团(公司编号:20151533091)因其客户来自全球各国,特别是除了美国之外的中国用户居多,因此公司一直和中国领先的社交软件微信保持着良 ...
- 【从零开始撸一个App】Fragment和导航中的使用
Fragment简介 Fragment自从Android 3.0引入开始,它所承担的角色就是显而易见的.它之于Activity就如html片段之于页面,好处无需赘述. Fragment的生命周期和Ac ...
- 【python3】 解:import导包机制
模块和包 模块:我们定义的.py结尾的文件就是一个模块,模块中通常定义了类.方法.变量等一系列功能: 包:存放模块的文件夹,含有init.py文件,定义path属性. import语句的作用 impo ...
- 在Windows服务中添加定时器
创建windows服务: 在VisualStudio中用C#创建一个Windows服务,微软MSDN参考地址: http://msdn.microsoft.com/zh-cn/library/zt39 ...
- 02.从0实现一个JVM语言之词法分析器-Lexer-03月02日更新
从0实现JVM语言之词法分析器-Lexer 本次有较大幅度更新, 老读者如果对前面的一些bug, 错误有疑问可以复盘或者留言. 源码github仓库, 如果这个系列文章对你有帮助, 希望获得你的一个s ...
- win10使用cmd命令关闭防火墙
在搜索框内输入cmd,右键选择管理员运行 然后输入: NetSh Advfirewall set allprofiles state off #关闭防火墙 Netsh Advfirewall show ...
- Mybatis系列全解(四):全网最全!Mybatis配置文件XML全貌详解
封面:洛小汐 作者:潘潘 做大事和做小事的难度是一样的.两者都会消耗你的时间和精力,所以如果决心做事,就要做大事,要确保你的梦想值得追求,未来的收获可以配得上你的努力. 前言 上一篇文章 <My ...
- golang操作redis/go-redis库
目录 Redis介绍 Redis支持的数据结构 Redis应用场景 准备Redis环境 go-redis库 安装 连接 普通连接 V8新版本相关 连接Redis哨兵模式 连接Redis集群 基本使用 ...
- .net 开源模板引擎jntemplate 教程:基础篇之语法
一.基本概念 上一篇我们简单的介绍了jntemplate并写了一个hello world(如果没有看过的,点击查看),本文将继续介绍jntemplate的模板语法. 我们在讲解语法前,首先要了解一下标 ...