手把手教你Android Litho UI框架---(一)入门篇

1.什么是Litho?

Litho是Facebook推出的一套高效构建Android UI 的声明式框架,主要 目的是提升RecyclerView复杂列表的滑动性能和降低内存的使用。

Litho是一套完全不同于Android的UI框架,他继承了Facebook一向的大胆风格,在Android采用React风格的UI。

2.入门

通过本篇学习,你将学到 (单组件显示 ,垂直布局显示,滚动列表显示) Hello World

首先我们在Android工程目录下app的 build.gradle中添加以下依赖:

dependencies {
    // Litho
    implementation 'com.facebook.litho:litho-core:0.33.0'
    implementation 'com.facebook.litho:litho-widget:0.33.0'

    annotationProcessor 'com.facebook.litho:litho-processor:0.33.0'

    // SoLoader
    implementation 'com.facebook.soloader:soloader:0.5.1'

    // For integration with Fresco
    implementation 'com.facebook.litho:litho-fresco:0.33.0'

    // For testing
    testImplementation 'com.facebook.litho:litho-testing:0.33.0'

    annotationProcessor 'com.facebook.litho:litho-sections-processor:0.33.0'
}
allprojects {
    repositories {
        jcenter()
    }
}

3.万能的Hello Wolrd

我们学任何语言都是从Hello World开始的,Litho也不例外。

首先,我们要在Application中初始化Litho

public class CFApp extends Application {

    @Override
    public void onCreate() {
        super.onCreate();
        //初始化Litho
        SoLoader.init(this,false);
    }
}

接下来我们就要开始写 Hello World 了:

在Activity的onCreate()方法中创建一个 ComponentContext ,然后再创建一个Text组件,如下代码:

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable 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));
    }
}

LithoView相当于Android中ViewGroup,是容纳View(在Litho中称为组件)的容器,,上面这个就是用LithoView显示Text组件的。

上面的组件如何发挥作用呢,我们来看看下面的代码

 final Component component = Text.create(context)
                .text("Hello World")
                .textSizeDip(50)
                .build();

Text是facebook组件包com.facebook.litho.widget里面的组件.它有很多属性,例如 text(设置文本内容)和textSize(设置字体大小),你可以像我上面写的那样设置,这些特征都是来之React术语启发中的props。

然后将Text组件作为单个子组件加入到LithoView中。

然后编译,运行App,你会得到以下内容

image

4.自定义垂直显示组件

我们来写一个带有标题和内容垂直显示的组件。在这里你可以学到自定义组件的知识。并可以做出简单的垂直显示的页面

我们现在来创建一个ListItemSpec 的类,并在类上面加入@LayoutSpec注解,如下:

注意:没命名一个组件类名,需要加Spec结尾,我实际上的组件名是ListItem

@LayoutSpec
public class ListItemSpec {

    @OnCreateLayout
    static Component onCreateLayout(ComponentContext context) {
        return Column.create(context)
                .paddingDip(YogaEdge.ALL, 16) //内间隙
                .backgroundColor(Color.WHITE)//背景颜色
                .child(//添加子布局
                        Text.create(context)
                                .text("Hello World")
                                .textSizeSp(40)
                                .build()
                )
                .child(
                        Text.create(context)
                                .text("Litho tutorial")
                                .textSizeSp(20)
                )
                .build();
    }

}

上面中Column是垂直组件,用来垂直显示布局,通过child加入需要垂直显示的子组件,就构成了垂直显示的布局,而且该child添加的数量没有限制。

由于Litho是使用Yoga,可以添加flexbox属性来设置子项的布局:

paddingDip 是用来设置内间隙的,YogaEdge.ALL属性是四周都设置相同长度的值,paddingDip(YogaEdge.ALL, 16) 表示上下左右都设置为16。当然YogaEdge还有其他的属性,如:LEFT 、TOP、RIGHT、BOTTOM、START、END、HORIZONTAL、VERTICAL

backgroundColor 是设置垂直布局的背景颜色

写好以上组件后,还不能调用,因为注解还没有生成代码。我们需要在Android studio 中通过Build make projectl 来生成我们的组件代码。

然后将上次写的Hello World组件注释,写入我们的垂直组件 ListItem,记住,后面不带Spc哦。并将你的组件加入到LithoView中

   public class MainActivity extends AppCompatActivity {

   @Override
   protected void onCreate(@Nullable Bundle savedInstanceState) {
       super.onCreate(savedInstanceState);

       final ComponentContext context = new ComponentContext(this);
       
       //显示 Hello World
//        final Component component = Text.create(context)
//                .text("Hello World")
//                .textSizeDip(50)
//                .build();
   
         //垂直组件,组件名是ListItem
       final Component listItem = ListItem.create(context).build();

       setContentView(LithoView.create(context, listItem));
   }
}

在这里,Litho采用的是通过注解处理器来生成自定义的代码,它通过查找“你定义的组件名”+Spec 类名,并生成 你的组件名和与你的规范相同包的类。这些类都将自动填写Litho所需的所有方法。除了这些规范外,注解处理器还会生成其他的方法(例如Text的textSize或者backgroundColor方法)。

然后我们运行,你就可以看到下面的内容

image

5.自定义垂直可以滚动的组件

要创建滚动的组件,我们还以继续向app的 build.gradle中添加Sections依赖

dependencies {
    ....省略显示之前添加的依赖,不了解的话可以翻到 2.入门查看
    
    // Sections
    implementation 'com.facebook.litho:litho-sections-core:0.33.0'
    implementation 'com.facebook.litho:litho-sections-widget:0.33.0'
    compileOnly 'com.facebook.litho:litho-sections-annotations:0.33.0'
    annotationProcessor 'com.facebook.litho:litho-sections-processor:0.33.0'
}

接下来我们准备写ListSectionSpec类,然后写以下代码

@GroupSectionSpec
public class ListSectionSpec {

    @OnCreateChildren
    static Children onCreateChildren(final SectionContext context) {
        //children是创建子组件
        Children.Builder builder = Children.create();
        //这里我们创建32个子组件,让屏幕沾满可以滚动
        for (int i = 0; i < 32; i++) {
            builder.child(
                    SingleComponentSection.create(context)
                        .key(String.valueOf(i)) //每个子组件的key
                        //加入我们上面创建的垂直标题和内容组件
                        .component(ListItem.create(context)
                                .build()
                            )
            );
        }
        return builder.build();
    }
}

SingleComponentSection是核心部分,是sections用于渲染单个组件,ListSectionSpec描述了具有32个子节的节,每个子节负责呈现ListItem。然后我们就可以将这一部分用RecyclerCollectionComponent显示我们的列表。RecyclerCollectionComponent是将一个节作为道具,并呈现一个RecyclerView,其中包含该节输出的任何UI,它还管理UI的更新和更改,例如刷新数据和执行从尾部提取,我们这里没有使用任何数据获取,所以不需要刷新。

然后 build 项目,让它生成代码。

接着 修改Activity,将之前的垂直显示注释掉,加入滚动的垂直显示组件代码

public class MainActivity extends AppCompatActivity {

    @Override
    protected void onCreate(@Nullable Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);

        final ComponentContext context = new ComponentContext(this);
        //显示 Hello World
//        final Component component = Text.create(context)
//                .text("Hello World")
//                .textSizeDip(50)
//                .build();

        //垂直组件,组件名是ListItem
//        final Component listItem = ListItem.create(context).build();


        //渲染可滚动的组件
    final Component listScrollComponent = RecyclerCollectionComponent.create(context)
            .disablePTR(true)
            .section(
                    ListSection.create(
                            new SectionContext(context)
                    ).build()
            ).build();

        setContentView(LithoView.create(context, listScrollComponent));
    }
}

注意是调用ListSection,而不是ListSectionSpec

运行程序,你将显示下面的滚动列表

image

好了今天我们的教程就到这里啦,接下来我会发布第二篇

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,591评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,448评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,823评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,204评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,228评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,190评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,078评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,923评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,334评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,550评论 2 333
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,727评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,428评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,022评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,672评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,826评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,734评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,619评论 2 354

推荐阅读更多精彩内容