All Projects → sanyuankexie → Flexml

sanyuankexie / Flexml

Licence: apache-2.0
🚀基于Litho的Android高性能动态业务容器。

Programming Languages

kotlin
9241 projects

Projects that are alternatives of or similar to Flexml

Diamond
Diamond is a full-stack web-framework written in The D Programming Language using vibe.d
Stars: ✭ 173 (-23.11%)
Mutual labels:  mvc, view, template-engine
Flexlib
FlexLib是一个基于flexbox模型,使用xml文件进行界面布局的框架,融合了web快速布局的能力,让iOS界面开发像写网页一样简单快速
Stars: ✭ 1,569 (+597.33%)
Mutual labels:  facebook, layout, flexbox
Enviews
🌟A cool dynamic view library
Stars: ✭ 1,771 (+687.11%)
Mutual labels:  view, dynamic
Expansionpanel
Android - Expansion panels contain creation flows and allow lightweight editing of an element.
Stars: ✭ 1,984 (+781.78%)
Mutual labels:  view, layout
Smtpd
A Lightweight High Performance ESMTP email server
Stars: ✭ 175 (-22.22%)
Mutual labels:  lightweight, high-performance
Arclayout
With Arc Layout explore new styles and approaches on material design
Stars: ✭ 1,662 (+638.67%)
Mutual labels:  view, layout
Spectre
Spectre.css - A Lightweight, Responsive and Modern CSS Framework
Stars: ✭ 10,938 (+4761.33%)
Mutual labels:  lightweight, flexbox
Transitioner
A library for dynamic view-to-view transitions
Stars: ✭ 2,049 (+810.67%)
Mutual labels:  view, dynamic
Bem Xjst
bem-xjst (eXtensible JavaScript Templates): declarative template engine for the browser and server
Stars: ✭ 115 (-48.89%)
Mutual labels:  view, template-engine
Elefant
Elefant, the refreshingly simple PHP CMS and web framework.
Stars: ✭ 188 (-16.44%)
Mutual labels:  mvc, template-engine
Grid
This package has moved and renamed
Stars: ✭ 2,079 (+824%)
Mutual labels:  layout, flexbox
Acgn Community
A community app for news,animation,music and novels developed material design style.
Stars: ✭ 193 (-14.22%)
Mutual labels:  mvc, glide
Easylogger
An ultra-lightweight(ROM<1.6K, RAM<0.3k), high-performance C/C++ log library. | 一款超轻量级(ROM<1.6K, RAM<0.3k)、高性能的 C/C++ 日志库
Stars: ✭ 1,968 (+774.67%)
Mutual labels:  lightweight, high-performance
Dry View
Complete, standalone view rendering system that gives you everything you need to write well-factored view code.
Stars: ✭ 124 (-44.89%)
Mutual labels:  mvc, view
Android Statefullayout
A custom Android ViewGroup to display different states of screen (CONTENT, PROGRESS, OFFLINE, EMPTY, etc.)
Stars: ✭ 140 (-37.78%)
Mutual labels:  view, layout
Cms
GleezCMS - A Light, Simple, Flexible Content Management System
Stars: ✭ 200 (-11.11%)
Mutual labels:  lightweight, high-performance
Rdgliderviewcontroller Swift
Control for a floating view gliding over a ViewController Edit
Stars: ✭ 102 (-54.67%)
Mutual labels:  view, glide
Blog
Lightweight self-hosted facebook-styled PHP blog.
Stars: ✭ 106 (-52.89%)
Mutual labels:  lightweight, facebook
Proteus
Lean, mean, and incredibly fast JVM framework for web and microservice development.
Stars: ✭ 178 (-20.89%)
Mutual labels:  mvc, high-performance
Android 3d Layout
Wow effect, transform your layout into 3D views
Stars: ✭ 199 (-11.56%)
Mutual labels:  view, layout

Flexml

0 注意

Gbox已经被重命名为FlexmlMacOS用户请一定使用0.3.1版本以上的插件。

1 适用的业务范围

在线上,对于某些适用于要求强展示、轻交互、高可配场景,我们有三种方案:

  • RN
  • WebView
  • RecyclerView

这三种方案各有各的问题。

使用RN时要占据整个Activity,而且Native和Js的通信损耗不可避。在另一边,WebView的情况则更加糟糕,需要lock主线程来加载webkit。所以这两种方案一般在这在二级、三级页面使用,如果在首页使用其实并不是非常理想。

那,RecyclerView呢?RecyclerView需要使用viewType来区分Holder,并且在每种Holder首次创建时都会执行预分配,最要命的是它还要测量布局,一下子测量那么多布局还是必须在主线程执行的操作,16ms的帧间隔只会让你铁掉帧。而且,如果我们基于viewType来实施动态化,那么Holder要怎么写?要写多少种viewType,样式有变怎么办?

什么!你说动态下发xml?Google:“想都别想,我用native API直接给你把路堵死,顺便还提升了我的性能”。

对于首页的feed流卡片、广告等,这些页面的逻辑本身就不强,而且往往也只是需要局部动态化,所以综合来看,RN和WebView硬着头皮上虽然还是能用的,但对性能的妥协就太大了,所以需要一个小型化的动态方案,并且在性能上达到极致。

2 简介

Flexml就是一个小型化的动态方案,专注于单View的动态化,它基于facebook的litho和google推荐的glide,可以这么说,它跟RN,还有点像...

但不同于传统的View的是,Flexml没有复杂的View层级,所以即使你在代码里套了1000层,它显示的可能也只有一个View。

Flexml使用Drawable直接将业务样式(文本、图片、圆角、颜色、边框等等)绘制在单个View之上,这将大大降低复杂布局在内存中的View数量(由N→1)。

你可以打开开发者模式查看View边界,这时往往只会看到一个View,除非是为了处理点击事件之类与View强相关的问题时才会自动的多生成一个VIew。

Flexml不使用任何非硬件加速的API,你看到的所有图像都是由硬件加速的API支持的,特别是在圆角处理上,不开玩笑几乎无敌。

  • 不是clipPath,我们有抗锯齿
  • 不是clipOutline,我们支持4个角设置不同的弧度并兼容api 19

但其原理也很简单,那就是使用Shader并配合Paint,在无圆角时直接drawRect,有相同圆角时使用drawRoundRect,在有不同的圆角时才使用drawPath,这种做法也是Android api 28中GradientDrawable实现圆角的做法。当然,我也将它们移植到了ColorDrawable和BitmapDrawable。

Flexml支持布局预加载,并且会在后台线程提前把布局测量好,不卡主线程。等需要显示的时候布局早已完成测量,会直接跳过measure环节直接就可以绘制,弯道超车完美解决16ms的vsync限制。

Flexml拥有良好的资源回收能力,它使用流行的Glide作为图片加载框架并结合litho的可见性感知api,能使你滑出屏幕的每一张图片都会被Glide有效回收。

Flexml提供一个playground appplayground app是一个集样例代码展示以及提供实时预览开发功能的app。

下面的截图,也是由Flexml绘制是直接从playground app中截取的,你可以在本仓库的release界面找到apk下载安装尝试,或者直接索取该布局的源码introduction/template.flexml

其实就连你在最开头看到的logo都是Flexml自绘制的,对应的源码在这logo/template.flexml

Flexml支持在真机上实时预览,为实现该功能,开发了Intellij(Android Studio)插件,配合playground app可以实时在真机上调试布局。

3 Wiki

集成、试用以及其他相关资料,请查看Github上的wiki页面

4 展望

未来,Flexml的目标是向iOS进军,在iOS设备上完成一套等价的SDK,得益于facebook和google强大的开源生态,所以这是可行的。

剩下的就是时间问题。

5 关于开源

Flexm使用kotlin开发,在Apache 2.0开源协议下发布,是一个完全基于开源软件实现的开源软件。由@LukeXeon维护。

Flexml是一个比较新的litho社区开源项目,有关其他其他facebook litho的社区开源项目,请在facebook的litho Community Showcase查找。

Note that the project description data, including the texts, logos, images, and/or trademarks, for each open source project belongs to its rightful owner. If you wish to add or remove any projects, please contact us at [email protected].