zoukankan      html  css  js  c++  java
  • (二)设备无关像素/逻辑像素

      其实这一篇文章的内容,应该是跟上一篇一起发布的,但是由于这个更多的是与UI相关的知识,因此单独开辟了一篇来写。

      写过Winform的人都知道Winform中对宽高的定义都是整形的,也就是说 不允许出现小数,这是为什么呢?

      答案很简单:Winform中宽高的单位是像素(px),而像素是显示图像的基本单位,不可再分割,因此只能是整形。

      使用像素决定应用的宽高比,会存在什么缺陷呢?

      以像素为单位决定宽高比的情况下,当你调整显示器分辨率时候,应用程序的大小就会发生变化。例如一个大小是1024x768的应用程序,如果把系统分辨率调成800*600会怎么样?很明显,这个程序会占用整个屏幕,还显示不全。Winform的应用程序就会发生这种牛逼的问题

      

      在WPF中,引入了一个新的概念 逻辑像素(logic pixel),又叫设备无关像素(device-independent pixel)。

      我们来看下它的定义

      1 逻辑像素=1/96 英寸

      看到了么?这货是以英寸为单位的!所以当你设置 Window的Width=96 Height=96时  你会获取到一个1*1英寸的窗口,有兴趣的可以拿尺子量一下。因此无论你如何调整分辨率,它都是1X1英寸的大小,所以你看到的窗体大小是固定的。

      逻辑像素跟像素又是怎么个关系呢?是怎么换算的呢?

      默认情况下,显示器默认每英寸的有96个像素   也就是96DPI, 这时候 Width=96 Height=96 窗体对应的像素也是96PX*96PX

          如果手贱调整为了120DPI  表示显示器每英寸有120个像素, 这时候Width=96 Height=96 窗体对应的像素是120PX*120PX

      

          看到了么? 逻辑像素 只认英寸,而且当显示器调整其每英寸像素数量的时候 逻辑像素向像素的转换也会自动增加像素比,就是这样,这个猥琐的单位保证了窗体的显示大小不变。这是为什么WPF中长与宽的单位允许小数点的存在,因为这是英寸,不是最小单位像素。同理这也是为什么Win8和WP7选择Xaml作为展示的原因!

       扯远了……

      以上就是逻辑像素的基本概念,下面我们来看看系统提供的一些默认值,这些默认值封装在System.Windows.WindowParameters中,其中大部分值都是以逻辑像素为单位,但是有两个特例,WindowParameters.SmallIconHeight 与 WindowParameters.SmallIconWidth这两个属性是以像素为单位的,因为图标的单位大家也都熟悉 16px X 16px  32px X 32px等

      Tips:

      逻辑像素虽然是以英寸为单位,但是不会100%的精确,这是由于系统原因与显示器硬件等原因造成的,但是整体来说屏蔽了由于分辨率修改造成的窗体大小变化问题。逻辑像素这个概念会在UI展示中经常遇到,因此要牢记。

        

  • 相关阅读:
    mysql limit
    random.nextint()
    “MSDTC 事务的导入失败: Result Code = 0x8004d00e。
    JUnit-4.11使用报java.lang.NoClassDefFoundError: org/hamcrest/SelfDescribing错误
    iOS ERROR: unable to get the receiver data from the DB 解决方式
    STL algorithm算法mov,move_backward(38)
    看 《一次谷歌面试趣事》 后感
    C++胜者树
    拿年终奖前跳槽,你才是赢家!
    日期字符串格式化成日期/日期格式化成指定格式字符串
  • 原文地址:https://www.cnblogs.com/ShadowLoki/p/2628670.html
Copyright © 2011-2022 走看看