安卓设备在屏幕尺寸和像素密度上差别很大,因此在使用WebView加载网页时就需要考虑到这种差别,对我们的网页做出精心的设计以在不同的屏幕上都能得到合适的展现。通常情况下,我们需要考虑到两个因素:
1、视区(viewport)
所谓的视区指的是Web页面绘制的矩形区域。viewport有很多属性是我们可以设置的,比如视区的大小和初始比例。其中最重要的一个是要指定视区的宽度,它是网页展示的水平像素点的总数量(即CSS像素点的数量)。
2、屏幕密度
WebView以及Android上的多数浏览器会把网页的CSS像素值转换为dip值(即设备独立像素),一般以一个中等密度的屏幕尺寸为基准(约160dpi大小)。如果对图像的展示有更高的要求,就需要关注不同屏幕密度的比例了,因为一张宽为300px的图像在320dpi的屏幕上会被放大(每个CSS像素会使用到更多的物理像素点),这会使得图像变得模糊而出现锯齿。
dip的换算:dip(value)=(int) (px(value)/1.5 + 0.5)。

dpi(dot per inch),每英寸像素数,反映了屏幕的清晰度,如120dpi,160dpi等,假设QVGA(320*240)分辨率的屏幕物理尺寸是(2英寸*1.5英寸),则dpi=160。

Viewport属性的设置
我们的网页会在viewport指定的区域内进行绘制。尽管viewport的总的可视区域在我们把网页缩到最小时会与屏幕大小一致,viewport也有自己的像素范围属性供网页来进行控制。比如,对于物理宽度为480像素的屏幕尺寸来说,viewport的宽度可以达到800像素,这样当viewport的比例设置为1.0时,网页就可以基于800像素的宽度来设计以完全地展示在屏幕上。Android上的多数浏览器都会默认把viewport设置得更大(通常被称为“宽视区模式”,宽度约为980px)。很多浏览器也会默认把网页尽量缩小以完全地展示出viewport的宽度(称为“俯瞰模式”)。需要注意的是,WebView默认并没有启用宽视区模式,如需启用,需调用setUseWideViewPort()方法。
在Web页面中,我们可以通过标签的来设置viewport的宽度和初始比例等属性。下面列出了viewport支持的属性及每个属性的取值类型:

content="height = [pixel_value | "device-height"] ,width = [pixel_value | "device-width"] ,initial-scale = float_value ,minimum-scale = float_value ,maximum-scale = float_value , user-scalable = ["yes" | "no"] " />

上面的例子指定了viewport的宽度为设备屏幕的宽度,并且不支持缩放操作。

通常情况下,我们都会把viewport的宽度设置为“device-width”,这样就可以在所有的屏幕上显示一致,然后通过CSS的媒介查询机制来灵活地进行布局以适配不同的屏幕尺寸。需要注意的是,只有在确保我们的网页布局能够灵活调整且网页内容能够适应小屏幕的宽度时我们才可以取消对缩放的支持。

通过CSS样式来设置适配不同设备屏幕密度
Android浏览器和WebView通过对CSS媒体特性“-webkit-device-pixel-ratio”的解析提供了对创建适配指定屏幕密度的CSS样式的支持。“-webkit-device-pixel-ratio”的取值为"0.75"、"1"和"1.5",分别对应低密度、中等密度和高密度3种屏幕。比如,下面的代码针对高密度和中等密度屏幕分别创建了CSS样式文件:

或者是在一个CSS样式文件中针对不同的屏幕密度设置不同的样式:

#header {
background:url(medium-density-image.png);
} @media screen and (-webkit-device-pixel-ratio: 1.5) {
/* CSS for high-density screens */
#header {
background:url(high-density-image.png);
}
} @media screen and (-webkit-device-pixel-ratio: 0.75) {
/* CSS for low-density screens */
#header {
background:url(low-density-image.png);
}
}

关于如何对图片进行处理以适配不同屏幕密度的更多信息,请参考http://www.html5rocks.com/en/mobile/high-dpi/这篇文章。
通过JavaScript脚本来设置适配不同设备屏幕密度
Android浏览器和WebView提供了一个DOM属性window.devicePixelRatio来获取当前网页所在设备的屏幕密度。window.devicePixelRatio的取值与前面提到的“-webkit-device-pixel-ratio”的取值一致,都是"0.75"、"1"和"1.5",分别对应低密度、中等密度和高密度3种屏幕。如果window.devicePixelRatio的值为"1.0",则目标设备的屏幕为中等密度,那么网页默认不会有任何缩放;如果window.devicePixelRatio的值为"1.5",则目标设备的屏幕为高密度,那么网页默认会放大为原来的1.5倍;如果window.devicePixelRatio的值为"0.75",则目标设备的屏幕为低密度,那么网页默认会缩小为原来的0.75。下面的代码演示了如何利用该属性查询设备的屏幕密度:

if (window.devicePixelRatio == 1.5) {
alert("This is a high-density screen");
} else if (window.devicePixelRatio == 0.75) {
alert("This is a low-density screen");
}

Web App适配不同屏幕的几点建议的更多相关文章

  1. Web App适配iPhoneX

    前言 Iphone每次退出新尺寸的手机都会掀起一番适配风波,这次没有下巴但有刘海的iPhoneX更是如此,网传横屏下的适配动画更是令不少人汗颜. 其实对于Native App来说,适配并不算困难(当然 ...

  2. rem : web app适配的秘密武器

    css html { font-size: calc(100vw / 3.75) } jsdocument.documentElement.style.fontSize = $(document.do ...

  3. 移动端Web App自适应布局探索

    1.困扰多时的问题 在这之前做Web App开发的的时候,在自适应方面一般都是宽度通过百分比,高度以iPhone6跟iPhone5之间的一个平衡值写死,我们的设计稿都是iPhone5的640 * 11 ...

  4. 利用iOS中Safari浏览器创建伪Web App

    在safari浏览器里有一个“添加到主屏幕”选项,我们可以用来创建伪Web App,下面来了解一下iOS中Safari的私有属性 第一步设置Web App的主屏幕图标: 有两种属性值apple-tou ...

  5. web app变革之rem(手机屏幕实现全适配)

    以往web移动适配,常规写法是:media only screen @media only screen and (min-device-width: 320px){ //针对iPhone 3 } @ ...

  6. web app iphone4 iphone5 iphone6 iphone6 Plus响应式布局 适配代码

    来源:http://www.phptext.net/article_view.php?id=387 -------------------------------------------------- ...

  7. web app开发技巧总结 (share)

    (转自http://hi.baidu.com/kuntakinte/item/ca92d6e5edae9fc0bbf37d08) 自Iphone和Android这两个牛逼的手机操作系统发布以来,在互联 ...

  8. Web App开发入门

    WebApp与Native App有何区别呢? Native App: 1.开发成本非常大.一般使用的开发语言为JAVA.C++.Objective-C. 2.更新体验较差.同时也比较麻烦.每一次发布 ...

  9. web app变革之rem

    rem这是个低调的css单位,近一两年开始崭露头角,有许多同学对rem的评价不一,有的在尝试使用,有的在使用过程中遇到坑就弃用了.但是我对rem综合评价是用来做web app它绝对是最合适的人选之一. ...

随机推荐

  1. Ext.js添加子组件

    Ext框架提供了很多api,对于不熟悉的人来说,api的释义有时不够明了.最近碰到了添加子组件的需求,特记录下来. 1. 例如,有一个窗体组件: 现在要为其添加一个字段“学校分类”,变成如下所示: 示 ...

  2. Return Largest Numbers in Arrays

    题目要求 右边大数组中包含了4个小数组,分别找到每个小数组中的最大值,然后把它们串联起来,形成一个新数组. 提示:你可以用for循环来迭代数组,并通过arr[i]的方式来访问数组的每个元素. 答题思路 ...

  3. Hibernate 异常提示_1

    INFO: HHH000041: Configured SessionFactory: null九月 15, 2016 12:29:35 上午 org.hibernate.engine.jdbc.co ...

  4. idea使用心得(4)-踩过的坑

    1.非法的表达式开始 / 需要';' / 未结束的字符串文字  表现形式:    原因/解决:       这个一定是文件编码问题:依次检查setting中的file Encodings 中的IDE ...

  5. 接入WebSocket记录

    为什么用 WebSocket 因为APP里面有个聊天功能,需要服务器主动推数据到APP.HTTP 通信方式只能由客户端主动拉取,服务器不能主动推给客户端,如果有实时的消息,要立刻通知客户端就麻烦了,要 ...

  6. linux命令日常总结

    1.date 显示系统日期2. mkdir xx 创建xx目录 rmdir xx 删除xx目录(空目录) rm -rf xx 删除xx目录(非空目录) 3. vi xx 创建某文件 写入-->e ...

  7. Peter Norvig:自学编程,十年磨一剑

    若要在某一领域内达到专家级的水平,其关键在于"审慎地重复",也就是说,并非是机械地,一遍又一遍地练习,而是要不断地挑战自我,试图超越自身当前的水平,通过不断的尝试挑战,并在尝试的过 ...

  8. XML和JSON数据格式对比

    概念 XML 扩展标记语言 (Extensible Markup Language, XML) ,用于标记电子文件使其具有结构性的标记语言,可以用来标记数据.定义数据类型,是一种允许用户对自己的标记语 ...

  9. UDP server & client

    Server: import java.io.IOException; import java.net.DatagramPacket; import java.net.DatagramSocket; ...

  10. 摘抄的 JAVA JDOM 操作XML文件

    JDOM修炼篇 用过XERCES的程序员都会感到,有时候用一句话就可以说清楚的事,当用XERCES的API来实现时,要三四行程序.   回页首 获得并安装JDOM 在 http://www.jdom. ...