About

<#TEMPLATE_INCLUDE_NINEPAGE_ABOUTME#>
  • Jun

    20

    物理尺寸单位一般用英寸表示,比如 iphone4s 为 3.5 英寸。像素尺寸单位一般就直接以像素表示,比如 iphone4s 屏幕分辨率为 640 像素 x 960 像素,一般用 PP 表示。物理点数(有些人称它为逻辑分辨率,也有些人称它为设备独立像素)一般用 DP 表示,比如 IPHONE 4S 与 3GS 有相同的物理点数都是320 x 480,但 4S 拥有不同的像素尺寸 640 x960。

    AS 可以有不少类的 API 都可以获取屏幕的像素分辨率尺寸,然后可以通过 Capabilities 类的 screenDPI 属性计算出一个设备屏幕的物理尺寸。但 AS 并没有提供任何属性或方法可以获取屏幕的物理点数。虽然 screenDPI  看上去像是获取每英寸内的 DP  值,但实际上它获取的是每英寸内 PP 值。

    如果使用 FeathersUI 的话,它里面提供了 DeviceCapabilities 类,能更方便的获取物理尺寸,但依然是不能获取物理点数的。

    Adobe 官方的博客有一节专门讲解了 “Calculating physical dimensions”:

    Looking at the dots-per-inch (more properly called PPI or pixels-per-inch), you can estimate how big your interface should be to avoid fat-finger mistakes. Apple suggests the minimum size for buttons and interactive objects should be 44 x 44 pixels for a 163 dpi screen (for example, an iPhone 3GS).

    Android uses the concept of density-independent pixels (dp), which is a normalized pixel unit for defining resolution compared to a 160 dpi screen. A device's dp is calculated as pixels * 160 / DPI. To determine the dpi, dp, and size in inches you can use the following code:

    Adobe 官方指出苹果公司推荐的 DPI 值是 160(实际是163,注意这个不是 Capabilities 里面 screenDPI 值,因为 screenDPI 实际是一个 PPI 值),但实际测试发现这个值在 IPHONE 上算出正确结果,但 PAD 上是完全错误的,所以这并没有什么卵用。

    移动版本的 AIR 并不支持 HTMLLoader 类,既便支持也不会有什么卵用,因为它使用的是 AIR Web 控件,所以读到的 99% 依然会是像素尺寸,不会是物理点数(因为不支持 HTMLLoader,所以我猜的)。

    但 AIR 支持 StageWebView ,它实际上调用的是系统原生的 Web 控件,而 Web 控件可以运行 JS,所以可以通过它来获取系统更多的信息。

    var swv:StageWebView = new StageWebView();
    swv.loadString('<script>function getInfo() {alert(window.screen.width + "x" + window.screen.height)} getInfo();</script>');

    现在可以很轻松的获得屏幕的物理点数了,但 StageWebView 中的 JS 是不能直接与 AS 交互的,所以要通过 location 来传递参数,但使用起来会比较不方便。推荐使用 StageWebViewBridge-master,它已经很好的包装了这个 location 属性,可以很方便的让 JS 与 AS 之间的通信。

    如果不知道 StageWebViewBridge 如何使用,这里有篇中文资料:http://bbs.9ria.com/thread-418243-1-1.html

    Jun

    20

    使用 StageWebViewBridge 时如果报以下错误:

    ReferenceError: Can't find variable: StageWebViewBridge

    是因为在 HTML 中找不到 StageWebViewDisk 类正则匹配的以下字符串:

    contents = contents.replace( _headRegexp, '<head><script type="text/javascript">' + JSCODE + '</script>' );

    需要注意这个匹配,或者自己修改:

    <head><script type="text/javascript">。。。。。。。。</script>

    无论是使用 loadString 或 loadURL,被加载的内容里面要包含这个匹配。