美文网首页第三方扩展
Yoga、Litho和React Native简要对比

Yoga、Litho和React Native简要对比

作者: zzzabc | 来源:发表于2017-04-28 11:23 被阅读293次

    简要说明

    Litho和Yoga都是基于Flexbox,Flexbox是一种布局模式,标准来自于前端CCS,可以理解为类似LinearLayout提供的一种布局规范。其中Litho底层依赖于Yoga部分模块,但是两者在原理上有一些区别。

    Yoga

    调用方式
    <?xml version="1.0" encoding="utf-8" ?>
    <YogaLayout
        xmlns:android="http://schemas.android.com/apk/res/android"
        xmlns:yoga="http://schemas.android.com/apk/res-auto"
        android:layout_width="match_parent"
        android:layout_height="match_parent"
        yoga:yg_alignItems="stretch"
        >
      <YogaLayout
          android:layout_width="match_parent"
          android:layout_height="wrap_content"
          android:background="@drawable/sample_children_background"
          yoga:yg_marginHorizontal="10dp"
          yoga:yg_marginTop="5dp"
          yoga:yg_flexDirection="row"
          yoga:yg_alignItems="center"
          >
        <ImageView
            android:layout_width="50dp"
            android:layout_height="50dp"
            android:src="@drawable/ic_launcher"
            yoga:yg_flex="0"
            />
        <TextView
            android:layout_width="match_parent"
            android:layout_height="wrap_content"
            android:text="@string/child_1_text"
            android:textColor="@color/children_text"
            yoga:yg_flex="1"
            yoga:yg_marginStart="8dp"
            />
      </YogaLayout>
    </YogaLayout>
    

    从调用方式不难看出,Yoga本质还是提供了一种容器(ViewGroup),自定义了很多的属性,符合Flexbox规范。因此,Android原生Widget(TextView/ImageView)直接使用。

    Litho

    调用方式
    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
    
        final ComponentContext context = new ComponentContext(this);
    
        final Component component = Text.create(context)
            .text("Hello World")
            .textSizeDip(50)
            .build();
    
        setContentView(LithoView.create(context, component));
    }
    

    对于Litho来说,它提供LithoView作为容器,所有的控件都是自定义的Component<T>。简单来说,内部使用的Widget(即Component<T>)跟Android原生的View并没有什么关系。Component<T>自定义了各种View属性(符合Flexbox规范)、布局方式、measure、layout,TouchEvent,以及绘制方式。
    因为全套Widget都不是走的Android的View体系,因此它可以支持非主线程UI进行measure/layout的,以及一些特殊的优化,比如它提到的RecycleView的高效回收。

    小结

    UI框架归根结底有两种实现,一种是基于原生框架做封装,提供一种语法糖功能,一种是自己实现了整套引擎。Yoga属于第一种,Litho属于第二种。

    支持Flexbox有什么好处?

    只需要了解一种统一的规范,就可以很舒服的在前端、windows、android、ios做出统一风格的UI,而不用每个平台去学习各个平台自有的各种View,比如android RelativeLayout,ios AutoLayout,两者属性名字没有什么关联性。Yoga官网的各平台的demo就是对于同一种布局的不同的语言实现,非常的相似。

    Yoga和Litho哪个好?

    两者都支持Flexbox规范。

    Yoga基于原生的框架实现,可以支持原生的控件,所以在支持Flexbox规范的基础上,可以实现更好的动画效果。

    Litho为全套框架都是自定义,在布局效率、内存占用上可以比原生UI框架更高,但是缺点是目前提供功能有限,无法支持太高级的动画效果、手势。

    因此对于已有的App,Yoga可能更适用于做一个试点功能引入,对于新的App,Litho可以作为新的View框架拿来做整套开发(可能会有坑)。

    React Native跟前面两者有什么区别

    其实React Native也是支持Flexbox的,React Native可以支持用JSX实现布局、Javascrpit实现所有的业务逻辑。底层是通过javascriptbridge实现对原生API的调用。所以它主要的开发语言是javascript,更好的支持跨平台,也容易热更新。
    而Yoga、Litho是各个平台用原生的语言开发。

    Yoga: 支持Flexbox、支持原生的Widget、跨平台,各个平台用原生语言。
    Litho: 支持Flexbox、实现整套UI引擎、仅支持android。
    Rn: 支持Flexbox、跨平台、主要用Javascript开发

    如果有理解错误,欢迎斧正。

    相关文章

      网友评论

      • Danny_Boy:"Yoga本质还是提供了一种容器(ViewGroup),自定义了很多的属性,符合Flexbox规范。因此,Android原生Widget(TextView/ImageView)直接使用。"

        如果Yoga本质是提供了一种和Android平台相关的容器,它还怎么是一个跨平台的布局引擎呢?
        zzzabc:@Danny_Boy 特地去翻了下,它的跨平台并不是说你在安卓写了一次,就可以什么都不用做挪到其他平台用。Yoga支持java oc swift 等开发语言。说明在各个平台都有各平台的版本,各平台的布局规范和概念做了统一。YOGA底层是C,所以比较好移植而已。

        而RN就不一样,无论哪个平台都是用js开发写。这点是有区别的。
      • bitman:分析得不错~

      本文标题:Yoga、Litho和React Native简要对比

      本文链接:https://www.haomeiwen.com/subject/pfuozttx.html