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

1.什么是Litho战坤?

Litho是Facebook推出的一套高效構建Android UI 的聲明式框架,主要 目的是提升RecyclerView復雜列表的滑動性能和降低內(nèi)存的使用问麸。

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()方法中創(chuàng)建一個 ComponentContext 桂对,然后再創(chuàng)建一個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組件的蕉斜。

上面的組件如何發(fā)揮作用呢逾柿,我們來看看下面的代碼

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

Text是facebook組件包com.facebook.litho.widget里面的組件.它有很多屬性,例如 text(設置文本內(nèi)容)和textSize(設置字體大小)宅此,你可以像我上面寫的那樣設置机错,這些特征都是來之React術語啟發(fā)中的props。

然后將Text組件作為單個子組件加入到LithoView中父腕。

然后編譯弱匪,運行App,你會得到以下內(nèi)容

image

4.自定義垂直顯示組件

我們來寫一個帶有標題和內(nèi)容垂直顯示的組件璧亮。在這里你可以學到自定義組件的知識萧诫。并可以做出簡單的垂直顯示的頁面

我們現(xiàn)在來創(chuàng)建一個ListItemSpec 的類,并在類上面加入@LayoutSpec注解枝嘶,如下:

注意:沒命名一個組件類名帘饶,需要加Spec結尾,我實際上的組件名是ListItem

@LayoutSpec
public class ListItemSpec {

    @OnCreateLayout
    static Component onCreateLayout(ComponentContext context) {
        return Column.create(context)
                .paddingDip(YogaEdge.ALL, 16) //內(nèi)間隙
                .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添加的數(shù)量沒有限制竞阐。

由于Litho是使用Yoga提茁,可以添加flexbox屬性來設置子項的布局:

paddingDip 是用來設置內(nèi)間隙的,YogaEdge.ALL屬性是四周都設置相同長度的值,paddingDip(YogaEdge.ALL, 16) 表示上下左右都設置為16馁菜。當然YogaEdge還有其他的屬性茴扁,如:LEFT 、TOP汪疮、RIGHT峭火、BOTTOM、START智嚷、END卖丸、HORIZONTAL、VERTICAL

backgroundColor 是設置垂直布局的背景顏色

寫好以上組件后盏道,還不能調(diào)用稍浆,因為注解還沒有生成代碼。我們需要在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 類名猾漫,并生成 你的組件名和與你的規(guī)范相同包的類。這些類都將自動填寫Litho所需的所有方法感凤。除了這些規(guī)范外悯周,注解處理器還會生成其他的方法(例如Text的textSize或者backgroundColor方法)。

然后我們運行陪竿,你就可以看到下面的內(nèi)容

image

5.自定義垂直可以滾動的組件

要創(chuàng)建滾動的組件队橙,我們還以繼續(xù)向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是創(chuàng)建子組件
        Children.Builder builder = Children.create();
        //這里我們創(chuàng)建32個子組件,讓屏幕沾滿可以滾動
        for (int i = 0; i < 32; i++) {
            builder.child(
                    SingleComponentSection.create(context)
                        .key(String.valueOf(i)) //每個子組件的key
                        //加入我們上面創(chuàng)建的垂直標題和內(nèi)容組件
                        .component(ListItem.create(context)
                                .build()
                            )
            );
        }
        return builder.build();
    }
}

SingleComponentSection是核心部分捐康,是sections用于渲染單個組件,ListSectionSpec描述了具有32個子節(jié)的節(jié)庸蔼,每個子節(jié)負責呈現(xiàn)ListItem解总。然后我們就可以將這一部分用RecyclerCollectionComponent顯示我們的列表。RecyclerCollectionComponent是將一個節(jié)作為道具姐仅,并呈現(xiàn)一個RecyclerView花枫,其中包含該節(jié)輸出的任何UI,它還管理UI的更新和更改掏膏,例如刷新數(shù)據(jù)和執(zhí)行從尾部提取劳翰,我們這里沒有使用任何數(shù)據(jù)獲取,所以不需要刷新馒疹。

然后 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));
    }
}

注意是調(diào)用ListSection腥刹,而不是ListSectionSpec

運行程序马胧,你將顯示下面的滾動列表

image

好了今天我們的教程就到這里啦,接下來我會發(fā)布第二篇

最后編輯于
?著作權歸作者所有,轉載或內(nèi)容合作請聯(lián)系作者
  • 序言:七十年代末衔峰,一起剝皮案震驚了整個濱河市佩脊,隨后出現(xiàn)的幾起案子蛙粘,更是在濱河造成了極大的恐慌,老刑警劉巖威彰,帶你破解...
    沈念sama閱讀 218,284評論 6 506
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件出牧,死亡現(xiàn)場離奇詭異,居然都是意外死亡,警方通過查閱死者的電腦和手機,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 93,115評論 3 395
  • 文/潘曉璐 我一進店門摧莽,熙熙樓的掌柜王于貴愁眉苦臉地迎上來医寿,“玉大人,你說我怎么就攤上這事盈咳」⒚迹” “怎么了?”我有些...
    開封第一講書人閱讀 164,614評論 0 354
  • 文/不壞的土叔 我叫張陵鱼响,是天一觀的道長鸣剪。 經(jīng)常有香客問我,道長丈积,這世上最難降的妖魔是什么筐骇? 我笑而不...
    開封第一講書人閱讀 58,671評論 1 293
  • 正文 為了忘掉前任,我火速辦了婚禮江滨,結果婚禮上铛纬,老公的妹妹穿的比我還像新娘。我一直安慰自己唬滑,他們只是感情好告唆,可當我...
    茶點故事閱讀 67,699評論 6 392
  • 文/花漫 我一把揭開白布。 她就那樣靜靜地躺著晶密,像睡著了一般擒悬。 火紅的嫁衣襯著肌膚如雪。 梳的紋絲不亂的頭發(fā)上稻艰,一...
    開封第一講書人閱讀 51,562評論 1 305
  • 那天懂牧,我揣著相機與錄音,去河邊找鬼尊勿。 笑死归苍,一個胖子當著我的面吹牛,可吹牛的內(nèi)容都是我干的运怖。 我是一名探鬼主播拼弃,決...
    沈念sama閱讀 40,309評論 3 418
  • 文/蒼蘭香墨 我猛地睜開眼,長吁一口氣:“原來是場噩夢啊……” “哼摇展!你這毒婦竟也來了吻氧?” 一聲冷哼從身側響起,我...
    開封第一講書人閱讀 39,223評論 0 276
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎盯孙,沒想到半個月后鲁森,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 45,668評論 1 314
  • 正文 獨居荒郊野嶺守林人離奇死亡振惰,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點故事閱讀 37,859評論 3 336
  • 正文 我和宋清朗相戀三年歌溉,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片骑晶。...
    茶點故事閱讀 39,981評論 1 348
  • 序言:一個原本活蹦亂跳的男人離奇死亡痛垛,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出桶蛔,到底是詐尸還是另有隱情匙头,我是刑警寧澤,帶...
    沈念sama閱讀 35,705評論 5 347
  • 正文 年R本政府宣布仔雷,位于F島的核電站蹂析,受9級特大地震影響,放射性物質(zhì)發(fā)生泄漏碟婆。R本人自食惡果不足惜电抚,卻給世界環(huán)境...
    茶點故事閱讀 41,310評論 3 330
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望竖共。 院中可真熱鬧蝙叛,春花似錦、人聲如沸肘迎。這莊子的主人今日做“春日...
    開封第一講書人閱讀 31,904評論 0 22
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽妓布。三九已至姻蚓,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間匣沼,已是汗流浹背狰挡。 一陣腳步聲響...
    開封第一講書人閱讀 33,023評論 1 270
  • 我被黑心中介騙來泰國打工, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留释涛,地道東北人加叁。 一個月前我還...
    沈念sama閱讀 48,146評論 3 370
  • 正文 我出身青樓,卻偏偏與公主長得像唇撬,于是被迫代替她去往敵國和親它匕。 傳聞我的和親對象是個殘疾皇子,可洞房花燭夜當晚...
    茶點故事閱讀 44,933評論 2 355

推薦閱讀更多精彩內(nèi)容