理解Android元视口缩放:我缺少什么?

lil*_*die 46 html scaling android

我一直在尝试确定视口 - 以及其中的内容 - 如何受到用于使用WebView或本机浏览器绘制内容的视口元标记的影响.

我遇到的是一些明显的不一致.我创建了一个小页面(见下文),其中包含一个图像和一些用于显示视口大小的javascript,因此我可以直观地看到图像的缩放以及获取确切的数字.

首先,一些观察:

  1. 视口宽度数字都不是我预期的,只是关闭.
  2. 当数字接近设备像素数时,绘图实际上是一对一地完成 - 或者至少看起来是那样的.
  3. 如果页面大小(文档大小)低于视口大小,则视口编号会缩小.也就是说,视口并不总是必然代表最大可能的可见空间 - 只是当前可见空间.
  4. 同样,在本机浏览器中,视口大小由顶部栏调整.当它滚出屏幕时,尺寸会增加.给出的数字用于全屏显示.

设备#1:物理屏幕为1024x600,运行Android 2.2.

  1. initial-scale = 1.0 => 676x400
  2. initial-scale = 1.0,width = device-width => 676x400
  3. initial-scale = 2,width = device-width => 338x200
  4. initial-scale = 2,width = device-width,target-densitydpi = device-dpi => 507x300
  5. initial-scale = 0.5,width = device-width,target-densitydpi = device-dpi => 800x473
  6. initial-scale = 0.9,width = device-width,target-densitydpi = device-dpi => 800x473
  7. width = device-width,target-densitydpi = device-dpi => 1014x600
  8. initial-scale = 1.0,width = device-width,target-densitydpi = device-dpi => 1014x600
  9. initial-scale = 0.5,width = device-width,target-densitydpi = device-dpi,minimum-scale = 0.1 => 2028x768
  10. initial-scale = 0.5,width = device-width,target-densitydpi = device-dpi,minimum-scale = 0.1,user-scalable = no => 1014x600

设备#2:物理屏幕为800x480,运行Android 2.3.2.

  1. initial-scale = 1.0 => 527x320
  2. initial-scale = 1.0,width = device-width => 527x320
  3. initial-scale = 2,width = device-width => 263x160
  4. initial-scale = 2,width = device-width,target-densitydpi = device-dpi => 395x240
  5. initial-scale = 0.5,width = device-width,target-densitydpi = device-dpi => 790x480
  6. initial-scale = 1.0,width = device-width,target-densitydpi = device-dpi => 790x480
  7. initial-scale = 0.5,width = device-width,target-densitydpi = device-dpi,minimum-scale = 0.1 => 1580x768
  8. initial-scale = 0.5,width = device-width,target-densitydpi = device-dpi,minimum-scale = 0.1,user-scalable = no => 790x480
  9. width = 1580,target-densitydpi = device-dpi => 790x480
  10. width = 1580,target-densitydpi = device-dpi => 790x480
  11. width = 1580,target-densitydpi = device-dpi,minimum-scale = 0.1 => 790x480

在这些结果中,以下内容没有意义:

  1. 设备#1,项目5,6和10
  2. 设备#2,项目5,8,10,11,12

有谁知道那些没有意义的事情发生了什么?

有谁知道为什么许多值与物理像素相匹配的10个像素,但结果就好像它们匹配?(例如1.7和2.6)

我做错了什么,或者除非用户也被允许缩放并设置最小比例值,否则看起来不可能缩小到1.0以外?

也就是说,即使有效值为0.01到10,除非您还可以设置最小比例,否则将忽略1.0以下的初始比例值.

Android的文档也说,当用户可扩展性是没有的最小/最大刻度值会被忽略.这似乎没有用.并且2.9-2.11似乎表明你不能自己计算它并设置宽度.

最后,我正在使用的HTML:

<html>
<script src="http://code.jquery.com/jquery-1.4.4.js"></script>
<head>
    <meta name="viewport" content="initial-scale=0.5, width=device-width, target-densitydpi=device-dpi, minimum-scale=0.1, user-scalable=no" />
</head>
<body style="margin:0;">
<div id="bld" class="bld" style="position:absolute; width:250px; height:125px; left:50px; background-color:#ccccff;">Hello world.</div>
<img id="bl1" src="http://commondatastorage.googleapis.com/kf6nvr/images/1024x768.png" />
<script> 
$("#bl1").click(function(){
    var pageWidth = $(document).width();
    var pageHeight = $(document).height();
    var viewportWidth = $(window).width();
    var viewportHeight = $(window).height();

     $("#bld").html("Page width: "+pageWidth+"<br />pageHeight: "+pageHeight+"<br />port width: "+viewportWidth+"<br />port height: "+viewportHeight);
});
</script> 
</body>
</html>
Run Code Online (Sandbox Code Playgroud)

那么......我错过了什么?

Már*_*son 15

你在那里开辟了有趣的蠕虫病毒.当您尝试更多设备时,您可能会看到更多的怪异和随机错误.有趣的时刻!:-)

我怀疑你可能想要放弃的某个地方,并试着......

  • 坚持尽可能简单的设置.
  • 接受设备选择报告的像素宽度.
  • 依靠自适应/流体布局和相对宽度,使事物在不同的屏幕宽度上工作.
  • 使用原生CSS属性进行圆角,阴影和渐变的分辨率中性渲染.
  • 尽可能使用矢量格式(svg,图标字体等)
  • 和(重要)使用高分辨率border-image以及background-image与良好支持的background-size属性1相结合,使事物呈现出美观和清晰2.

1)为了向旧浏览器(如MSIE8)提供向后兼容性,您需要使用双重background-image声明 - 例如:

background-image: url(low-res.png);        /* CSS2 */
background-image: url(high-res.png), none; /* CSS3 */
background-size:  100px 10px;             /* CSS3 */
Run Code Online (Sandbox Code Playgroud)

2)-webkit-max-device-pixel-ratio媒体查询也可以帮助,但顾名思义它仅适用于WebKit浏览器.


漫谈:

新一代Android和iOS设备具有不同的屏幕DPI,他们使用它来报告CSS像素而不是实际的设备像素.这既好又坏 - 取决于你如何看待它.

这很糟糕,因为你不再能够保证你曾经拥有过的设备像素控制,并且使用了大多数同质的屏幕.

另一方面,它很好,因为你知道你的设计永远不会变得如此微小,以至于普通人无法阅读/使用它们.

使用的问题target-densitydpi=device-dpi在于,当它在7英寸宽的800px屏幕上工作奇迹时,它将彻底破坏你在4英寸宽960px屏幕上的应用程序.