Gbox开源:比RN和WebView更轻的高性能动态化业务容器,解决首页动态化的痛点(1)

  • 强大的布局内绑定表达式。包括数学运算,for语句,三元表达式,简单的java方法调用,使用表达式时需使用${}包围
  • 屏幕适配,布局使用的单位为是设备独立的pt,以设备屏幕宽度为基准,将屏幕分成360份,1pt=设备屏幕宽度/360
  • 使用kotlin实现,代码实现非常简洁,很适合阅读学习
  • 对旧逻辑友好,支持原生View嵌入Gbox
3.3 与MTFlexbox对比

对比美团首页线上方案MTFlexbox,左为MTFlexbox(美团APP),右为Gbox(Gbox的实时预览APP)。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

由于布局文件字太多,所以我就不直接往文章里仍了,你可以在Gbox的github仓库上拿到👉这个布局文件

4 开始搭建Gbox开发环境

4.1 安装Overview APP

使用git clone 源码:

git clone https://github.com/sanyuankexie/Gbox

由于项目中使用了APT技术,所以将源码clone完毕后,需要先rebuild一次。

首先我们需要安装overview APP,打开找到overview模块,将overview APP安装到你的测试机上。

接下来是最重要的一步,确保你的手机和你的电脑处于同一网络环境中,推荐是使用热点。

4.2 执行测试用例

找到mock模块中的MockTestCase文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

运行JUnit的@Test,即可在控制台中生成地址二维码,你还可以更改layout和data的路径使用其他样式或者mock数据。注意Android Studio的主题色需为白色,否则生成的二维码无法被手机识别。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

(调整为白色主题👇)

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

可以看到二维码已经在控制台生成。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

此时,使用overview

4.3 开始实时预览

APP扫描控制台生成的二维码,即可预览电脑上的布局文件。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

打开LiveReload开关,可以实现实时预览的效果,在电脑上修改布局之后,使用Ctrl+S保存,即可刷新到overview APP上。控制台用于打印埋点和点击信息(如果有的情况下)。

那么Gbox是如何实现实时预览的呢?

原理其实很简单,也许你都已经猜到了。mock模块打开了一个http服务器,overview扫码拿到的是电脑的ip地址和端口号,然后overview每隔一秒去请求服务器下发布局和数据,这样就可完成布局的实时预览。附上源码👉MockSession.kt

5 开始编写布局文件

5.1 绑定表达式

在开始编写布局之前我们需要了解Gbox的绑定表达式。

Gbox的绑定表达式是基于嵌入式Tomcat(对!就是用在Spring Boot上那个)所使用的EL表达式类库开发的,所以它支持EL表达式的所有特性,包括Java Bean访问、方法调用、三元表达式、数学运算等的。

假如你有一个像下面一样的json:

{
“number”:1000,
“control”:{
“display”:true
},
“text”:“这段文字不会被显示”
}

编写下面的绑定表达式

<?xml version="1.0" encoding="utf-8"?>




这个Text将不会显示文本’这段文字不会被显示’,而会显示’其他文本’。值得注意的是在绑定表达式中字符串常量使用单引号包裹。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

数学运算:

<?xml version="1.0" encoding="utf-8"?>




不止是text属性,你还可以在任意属性中使用绑定表达式,以满足你数据展示的需要。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.2 Flex

由于Gbox是基于Litho的UI框架,而Litho又是使用yoga这个基于flexbox布局模型的布局引擎的,所以首先要支持的就是Flex,顾名思义,就是弹性容器。

Flex的实现非常简单,你可以理解为增强版的LinenerLayout,它支持以下属性:

首先是flexDirection,它用来指定主轴方向,支持row、column、rowReverse、columnReverse四种排布方式,下面是row和column的截图,没有填写flexDirection时则默认为row。

<?xml version="1.0" encoding="utf-8"?>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<?xml version="1.0" encoding="utf-8"?>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

接下来是justifyContent属性,它标识了其所有子Layout在主轴上的对齐方式,包含flexStart、flexEnd、center、spaceBetween、spaceAround五种,下面我通过编写一个xml,展示了该效果。

flexStart、flexEnd、center无需多言,而spaceBetween、spaceAround需要解释一下。

  • spaceBetween是指两端对齐,项目之间的间隔都相等。
  • spaceAround是指每个项目两侧的间隔相等。
<?xml version="1.0" encoding="utf-8"?>
































外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

屏幕太小,一张截图截不完。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

然后是alignItems,它描述的的子Layout在副轴上的对齐方式,支持flexStart、flexEnd、center、baseline、stretch五种。

其中baseline表示与项目的第一行文字的基线对齐,stretch指定时,如果子Layout未指定高度,则会占满父Layout。

编写下面的xml:

<?xml version="1.0" encoding="utf-8"?>
































外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

在上面的布局中,你会发现360这个值会经常出现,没错,在Gbox中它是一个特殊值。为了做屏幕适配,Gbox的大小单位是设备独立的,它以屏幕宽度作为基准,将屏幕宽度分为360份,一个单位的像素值=屏幕宽度像素值/360,这也刚好是2x设计图纸的大小,相信你们的UI设计师会喜欢Gbox的。

Gbox的所有布局属性和层级,最终将被应用到facebook的yoga布局引擎中去,无论布局有多复杂您都不需要担心,因为所有的计算都是在可指定的Layout线程中进行的,根本不会影响主线程,并且最终生成在屏幕上的View是没有这些冗余布局层级的。有关更多Litho的信息,建议您查阅Litho的相关文档

5.3 Frame

Frame实现了类似Android上FrameLayout的布局效果,用于实现Flex难以实现的多层叠加效果。

在Frame上,Gbox采用了比Flex更激进的布局测量策略。我们都知道,在Android的FrameLayout中onMeasure会去测量所有的子Layout,最终才能确定宽高,Gbox中利用Litho的Component的不可变性(线程安全),将这一操作进行了并行化。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

Frame拥有独立的线程池,可以并发地测量所有地子Layout,最终的结果在一个线程汇集,下图演示了该过程。

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

PS: 说人话就是调用了java.util.concurrent.Executors#newCachedThreadPool,然后等待在一个线程等待其他java.util.concurrent.Future完成,源码链接👉FrameFactory.kt

编写下面的布局实现叠加效果:

<?xml version="1.0" encoding="utf-8"?>

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.4 Image

Image不仅仅只是一张简单的ImageView,它封装了Glide图片加载引擎,支持异步加载、圆角裁剪和高斯模糊。

使用url来加载网络图片:

Gbox没有使用Litho的State来实现异步图片加载,所以不会触发Litho的布局更新,而是直接替换底层的Drawble,然后调用invalidateDrawable,刷新脏矩形。

PS: 说人话就是使用了DrawableWrapper.kt

mock所使用的json数据:

{
“image2”: “http://5b0988e595225.cdn.sohucs.com/images/20180606/0a49d21848324503a1e04c4b942a1631.png”
}

编写xml:

<?xml version="1.0" encoding="utf-8"?>




外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

borderRadius存在时,内部的图片会被裁剪:

<?xml version="1.0" encoding="utf-8"?>




外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

使用blurRadius和blurSampling控制高斯模糊:

blurRadius为弧度,值在1-25之间,blurSampling为采样率,值要比1大。

Gbox使用renderscript技术将高斯模糊的效率最大化,能够减少使用高斯模糊时图片出现的延迟时间。

PS: 说人话就是在Glide加载图片的时候加了个Transformation,源码链接👉BlurTransformation.kt

外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

<?xml version="1.0" encoding="utf-8"?>




外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

与ImageView一样支持scaleType:

细心的朋友会发现,其实上面已经在使用fitXY了,笑~

<?xml version="1.0" encoding="utf-8"?>




外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传

5.5 Text

Text用于显示文本,目前支持一下属性修饰:

  • text用于指定要显示的文本
  • horizontalGravity用于指定文本对齐方式,支持center、left、right
  • textSize用于指定文本大小
  • textStyle用于指定文本风格如normal(默认)、bold(粗体)
  • maxLines指定最大行数
  • minLines指定最小行数
  • textColor指定字体颜色
<?xml version="1.0" encoding="utf-8"?>






最后为了帮助大家深刻理解Android相关知识点的原理以及面试相关知识,这里放上我搜集整理的2019-2021BATJ 面试真题解析,我把大厂面试中常被问到的技术点整理成了PDF,包知识脉络 + 诸多细节。

节省大家在网上搜索资料的时间来学习,也可以分享给身边好友一起学习。

一键领取:【Android超硬核面试资料】

《960全网最全Android开发笔记》

《379页Android开发面试宝典》

历时半年,我们整理了这份市面上最全面的安卓面试题解析大全
包含了腾讯、百度、小米、阿里、乐视、美团、58、猎豹、360、新浪、搜狐等一线互联网公司面试被问到的题目。熟悉本文中列出的知识点会大大增加通过前两轮技术面试的几率。

如何使用它?

1.可以通过目录索引直接翻看需要的知识点,查漏补缺。
2.五角星数表示面试问到的频率,代表重要推荐指数

《507页Android开发相关源码解析》

只要是程序员,不管是Java还是Android,如果不去阅读源码,只看API文档,那就只是停留于皮毛,这对我们知识体系的建立和完备以及实战技术的提升都是不利的。

真正最能锻炼能力的便是直接去阅读源码,不仅限于阅读各大系统源码,还包括各种优秀的开源库。

腾讯、字节跳动、阿里、百度等BAT大厂 2019-2021面试真题解析

资料太多,全部展示会影响篇幅,暂时就先列举这些部分截图,大家可以点击这里自行获取。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
img
img
img
img

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
img

dn.net/topics/618156601)自行获取。

自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。

深知大多数初中级安卓工程师,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新Android移动开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
[外链图片转存中…(img-iccZ4HzO-1710968130133)]
[外链图片转存中…(img-mrxArzOr-1710968130134)]
[外链图片转存中…(img-OgEvVG11-1710968130134)]
[外链图片转存中…(img-rap9OGdo-1710968130135)]

由于文件比较大,这里只是将部分目录截图出来,每个节点里面都包含大厂面经、学习笔记、源码讲义、实战项目、讲解视频
如果你觉得这些内容对你有帮助,可以添加下面V无偿领取!(备注Android)
[外链图片转存中…(img-9f1cSMt2-1710968130135)]

  • 16
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值