Weex布局尺寸通用适配方案的研究

问题

weex为前端赋予了强大的跨端开发能力和较一致的良好的用户体验。weex一般是与native进行协作开发:

  1. 同app内不同页面用两者分别开发,统一串联
  2. 同页面两者协作开发,比如native提供组件,weex使用

由于native布局一般采用定高不定宽的方式,以求不同尺寸的屏幕可以得到基本一致的布局体验,然而weex布局采用基于750的等比例缩放,这种不一致导致的问题:

  1. 同一元素在不同屏幕的尺寸展现不一致,大屏手机尺寸偏大,小屏手机尺寸偏小
  2. 与native尺寸偏差较多

字号的差异也比较明显。

默认依据ip6尺寸布局,惨不忍睹的现场直击...

  • 红框部分的滑动组件是native的,而背景容器是weex布局的,由于weex等比例缩放,而native使用pt,导致iphone 5s native组件溢出,而iphone 6p组件相比于容器过小。

  • 下面是iphone 6p下native列表和weex列表字号对比

思考及分析

weex目前的尺寸处理方式:

无视屏幕分辨率和尺寸,虚拟宽度统一为750,布局尺寸以750为基准按比例缩放。

那么使用weex原生尺寸定义想实现native的体验“在不同尺寸手机上同样元素的尺寸基本一致”是不太可能的。

不过weex在Js运行时提供了屏幕的物理分辨率和像素比例,那么运行时可不可以用js动态算一下呢?

我们定义weex的原生尺寸为vp(virtual pixel),视觉稿的尺寸或native的尺寸为ns(native size)。

期待的转换规则为

vp = translateRule(dp)

这样用户只需要按native的方式写布局尺寸,就可以映射为weex的尺寸,被weex布局逻辑动态解析,从而达到我们的目的。

既然我们要模拟Native的尺寸适配,首先要知己知彼,简单了解了一下native的适配方法

安卓尺寸适配

安卓提供了一个万能的适配单位:dp,dp屏蔽了屏幕大小和分辨率,提供了一致体验,dp和物理像素的换算关系如下:

dp = px / (dpi / 160)

欲转换先取dpi,可惜weex没有dpi,但提供了一个比例scale,可用来计算dpi

scale = dpi / 160

换算可得

vp = dp * 750 / ( deviceWidth / scale )

IOS尺寸适配

类似dp的单位是着色器(似乎等同于pt?)

pt = px / scale

换算可得

vp = pt * 750 / ( deviceWidth / scale )

通过分析我们发现,安卓和IOS的适配规则殊途同归,可统一转换规则为:

    function translateRule(dp) {
        return dp * 750 / ( deviceWidth / scale );
    }

到这里似乎大功告成,只要在写样式时祭出我们的法宝:计算属性,并动态赋到模板节点的style属性上即可。然而这种方式让开发同学想起了前端茹毛饮血的上古时代,而今前端显然已经沐浴在现代化的春风里很久了。如果在写样式的时候需要写固定尺寸时,能像native一样直接写pt/dp这样的单位那肯定是极好的。

扫了一下经过weex-loader编译的代码,与vue-loader编译的区别主要是在style的处理上,前者将style编译为map形式,并挂载到Vue实例上,所以我们在两个位置可以拿到编译后的style map

  1. vue实例生命周期内
  2. vue导出的组件对象上

由此有两个插入自动处理尺寸逻辑的方案:

  1. 运行时。于上述2的位置,扫描vue实例的style map,过滤出自定义单位和值并替换为weex识别的尺寸
  2. 编译时。通过webpack loader对vue文件进行预处理,扫描自定义单位并于1位置注入运行时处理尺寸的逻辑

分析

方案一:

  1. 性能较差,需要遍历每个页面整个组件树的style map
  2. vue实例拿到的style map,已被weex-loader过滤掉自定义单位,变成了人畜无害的数字。。。
  3. 需要js代码处理,一看就不是weex的亲儿子单位

结论:放弃

方案二:

  1. 每个组件单独注入修改尺寸的代码,免去了遍历组件树的开销
  2. 在weex-loader的样式分析之前解析,可以拿到原始样式代码
  3. 纯编译时纯工具处理,使用自定义单位如同使用原生单位一样方便,weex开发者毫无感知

结论:靠谱

实现

主流程

  • 识别style里的自定义单位/函数,抽取单位前的数值
  • 根据规则生成尺寸处理逻辑的代码
  • 注入到vue实例的beforeCreate函数里

样式识别支持less和css

单位一般用于单参数映射规则,多参数映射规则可写成函数

规则文件

基于以下原因,需要独立的、用户自定义的、vue实例里可以方便引用的规则文件

  • 可能需要多个单位,因此需要一个规则集合
  • 规则需要支持自定义,方便使用者修改和扩展
  • 用户可能也需要手动调用某个单位的计算规则,比如实现动画

loader实现内部提供了一个默认的规则文件,支持用户自定义规则文件去覆盖和扩展默认规则

默认规则

单位/函数 描述
dp 模拟安卓dp单位, 兼容ios,与native布局尺寸相同
mq media query
vw 相对于屏幕宽度的百分比
vh 相对于屏幕高度的百分比

数据流图如下:

效果

无痛使用

    .class-name {
        /*
            自定义单位/处理函数dp, vw
            多个参数可用函数形式,单参数建议用单位
        */
        width: 100dp;
        height: 200vw;
        font-size: dp(24, 750); //可直接用24dp,这里仅做例子
    }

UI效果

  • 不同尺寸屏幕native组件和weex容器完美契合(贴图不是实际屏幕大小,所以5s布局尺寸看着比较大,仅做页面内native和weex的尺寸比较)

  • weex与native文字尺寸基本一致(由于weex安卓使用小数字号有问题,所以计算后的字号做了四舍五入取整,且字体也差异,所以效果还是稍微有点差异,但对比做适配前已经好很多了)

扩展

因为实现原理是编译时解析自定义样式函数,并插入运行时js代码。因此除了用于计算尺寸外,还可以计算其他依赖环境(比如屏幕尺寸、设备类型等)的样式,成为一个通用的weex css运行时处理工具。

当然更期待着weex原生支持各种布局单位,这才是康庄大道。

包地址:http://web.npm.alibaba-inc.com/package/@ali/weex-css-runtime-loader

时间: 2024-11-01 07:14:09

Weex布局尺寸通用适配方案的研究的相关文章

iPhone 6 / 6 Plus 设计·适配方案

from:http://www.xiaoketang.net/iphone-6-6-plus-设计·适配方案.html treelessing2014.10.29   关于iPhone6/6+适配问题一直有争议,今天小编专门为大家整理了相关的有效方案,希望对大伙儿有帮助!   移动app开发中多种设备尺寸适配问题,过去只属于Android阵营的头疼事儿,只是很多设计师选择性地忽视android适配问题,只出一套iOS平台设计稿.随着苹果发布两种新尺寸的大屏iPhone 6,iOS平台尺寸适配问题

一种粗暴快速的Android全屏幕适配方案

本文讲的是一种粗暴快速的Android全屏幕适配方案,由于Android碎片化严重,屏幕适配一直是开发中较为头疼的问题.面对市面上五花八门的屏幕大小与分辨率,Android基于dp与res目录名称来适配的方案已无法满足一次编写全屏幕适配的需求,为了达到最优的视觉效果,开发过程中总是需要花费较多资源进行适配.也有开发者给出了一些自己的解决方案.首先来分析一下一些常见的解决方案的现状: 1. 官方适配方案 – dp.dp是Android开发中特有的一个单位.与px不同,dp是基于屏幕像素密度的一种单

Android 屏幕适配方案

转载请标明出处:  http://blog.csdn.net/lmj623565791/article/details/45460089:  1.概述 大家在Android开发时,肯定会觉得屏幕适配是个尤其痛苦的事,各种屏幕尺寸适配起来蛋疼无比.如果我们换个角度我们看下这个问题,不知道大家有没有了解过web前端开发,或者说大家对于网页都不陌生吧,其实适配的问题在web页面的设计中理论上也存在,为什么这么说呢?电脑的显示器的分辨率.包括手机分辨率,我敢说分辨率的种类远超过Android设备的分辨率

cocos2d-x多分辨率适配方案:setDesignResolutionSize(完美)

cocos2d-x是一个优秀的跨平台游戏引擎,当然跨平台超容易遇到的分辨率适配问题,cocos2d-x也提供了超好用的解决方案. 官方的多分辨率适配wiki页面在这里:http://www.cocos2d-x.org/projects/cocos2d-x/wiki/Multi_resolution_support 当然这是E文的教程,而且有些细节官方也没有说清楚,下面就开始我自己的一些见解了. ====本教程基于cocos2d-x-2.1.4撰写==== 1. setDesignResoluti

实用Android 屏幕适配方案分享

转载地址:http://blog.csdn.net/gao_chun/article/details/45645051 真正可用,并且简单易行,可以在多个屏幕大小和屏幕密度上有良好表现的Android 屏幕适配方案,已用在一款成熟互联网应用中,效果还不错. 说起android开发,UI界面的多机型适配,一向是个很重要的问题. 网上这方面的文章很多,面试的时候也经常会问到,大部分的内容都很类似,无外乎用dp,sp 不要用px之类老生常谈的问题. 但是会说的居多,实际可以执行的可行方案,很少有人会.

android多分辨率多屏幕密度下UI适配方案

文章转载自http://www.jcodecraeer.com/a/anzhuokaifa/androidkaifa/2013/0627/1393.html 摘要 前言 Android 设计之初就考虑到了 UI 在多平台的适配,它本身提供了一套完善的适配机制,随着版本的发展适配也越来越精确, UI 适配主要受平台两个因素的影响:屏幕尺寸(屏幕的像素宽度及像素高度)和屏幕密度,针对不同的应用场景采用的适配方案也不一样, 前言 Android设计之初就考虑到了UI在多平台的适配,它本身提供了一套完善

Android使用fitsSystemWindows属性实现–状态栏【status_bar】各版本适配方案

Android使用fitsSystemWindows属性实现–状态栏[status_bar]各版本适配方案  首先我们看下qq的status bar在各个android版本系统中适配: 1.Android5.0以上:半透明(APP 的内容不被上拉到状态)  2.Android4.4以上:全透明(APP 的内容不被上拉到状态)  3.Android4.4以下:不占据status bar  这里我们就按照qq在各个android的版本显示进行适配:  1.Android5.0以上:material

搜狐快站首发Apple Watch网页适配方案

中介交易 http://www.aliyun.com/zixun/aggregation/6858.html">SEO诊断淘宝客 站长团购 云主机 技术大厅 每年的苹果新品发布会,已然成为业界潮流的风向标,这一次也不例外.在上周刚刚结束的苹果发布会上,AppleWatch的曝光引起了全世界的关注,就在大家还在研究其各项功能的时候,据内部消息透露,搜狐快站已全球首发一套可为AppleWatch提供的网页适配方案. 内部人士称,在AppleWatch发布后,搜狐快站第一时间根据AppleWat

网页设计要在设计布局之前决定色彩方案

文章描述:网页设计要在设计布局之前决定色彩方案. 网页设计吸引人的地方在哪里?是图片还是对内容的布局?或者说是网站的内容决定了网站的价值.所有这些因素都会发挥其作用,但正是配色方案决定了设计是否出彩. 有经验的专业人士会告诉你很多诀窍,比如说,一种配色方案可能适合一种设计,但未必适合于另一种:配色方案选择应该在布局内容之前还是之后?今天我们就要找到这些问题的答案,本文中,你也能找到很多免费资源供你选择配色方案. 请注意:这个话题内容很广,单这样一篇小文章是无法涵盖所有内容的.因此,我提供了相关资