Litho的使用–基本使用及加载网络图片

Litho是Facebook推出的一套高效构建Android UI的声明式框架,主要目的是提升RecyclerView复杂列表的滑动性能和降低内存占用。详见Litho的原理
以及Litho官网,这里记录下我自己对Litho的基本使用。

Litho的配置

这里采用官网上的kotlin配置:
Module的build.gradle添加:

apply plugin: 'kotlin-kapt'
dependencies {// ...// Lithoimplementation 'com.facebook.litho:litho-core:0.21.0'implementation 'com.facebook.litho:litho-widget:0.21.0'compileOnly 'com.facebook.litho:litho-annotations:0.21.0'kapt  'com.facebook.litho:litho-processor:0.21.0'// SoLoaderimplementation 'com.facebook.soloader:soloader:0.5.1'// For integration with Frescoimplementation 'com.facebook.litho:litho-fresco:0.21.0'// For testingtestImplementation 'com.facebook.litho:litho-testing:0.21.0'//下面是可选的库// Sectionsimplementation 'com.facebook.litho:litho-sections-core:0.21.0'implementation 'com.facebook.litho:litho-sections-widget:0.21.0'compileOnly 'com.facebook.litho:litho-sections-annotations:0.21.0'kapt  'com.facebook.litho:litho-sections-processor:0.21.0'
}

project的build.gradle添加

repositories {jcenter()
}

Litho的Hello World

首先在自定义的Application的onCreate方法中添加

SoLoader.init(this, false)

然后就可以使用Litho了

class MainActivity : AppCompatActivity() {override fun onCreate(savedInstanceState: Bundle?) {super.onCreate(savedInstanceState)val cc = ComponentContext(this)setContentView(LithoView.create(this,getTextView(cc)))}/*** 获取TextView*/private fun getTextView(cc: ComponentContext): Component? {return Text.create(cc).textColorRes(R.color.colorPrimary).text("Hello World!").textSizeDip(50f).build()}
}

明显看出来是React的UI风格,与kotlin、flutter写界面有异曲同工之处。由于kotlin的简洁性,可以将抽出一个工具Litho.kt,网上已经有轮子,拿来直接用,这里就不贴出来了,详见demo。简化后的代码,如下:

    /*** 获取TextView*/private fun getTextView(cc: ComponentContext): Component? {return text(cc) {textColorRes(R.color.colorPrimary)text("Hello World!")textSizeDip(50f)}.build()}

当然Litho并不是这样用的,Litho类似dragger2一样,可以通过注解apt的形式生成我们需要的布局,两种方式:@LayoutSpec和@MountSpec,首先看一下@LayoutSpec

LayoutSpec

话不多说,直接上代码:

@LayoutSpec
object LayoutComponentSpec {@OnCreateLayoutfun onCreateLayout(c: ComponentContext): Component {return column(c) {paddingDip(YogaEdge.ALL, 8f)children {text {text("title")textColorRes(R.color.colorPrimary)textSizeDip(28f)}text {text("content")textColorRes(R.color.colorAccent)textSizeDip(16f)}}}}
}

Build之后就会生成一个LayoutComponent类,和之前的Text一样使用

     val layoutComponent = LayoutComponent.create(cc).build()setContentView(LithoView.create(this,layoutComponent))

这个时候,打开开发者设置里的显示布局,可以清晰的看出来,浑然一体。

本文只是对Litho的简单使用,原理和属性,请移步官网。

MountSpec

Mount Specs 定义了一个可以渲染 View 或 drawable 的组件.
Mount Specs 组件的生命周期如下所示:

  1. 在布局计算之前运行 @OnPrepare 一次。
  2. 在布局计算期间选择性运行 @OnMeasure 。
  3. 在布局计算之后运行 @OnBoundsDefined 一次。
  4. 在组件挂接到宿主 View 之前运行 @OnCreateMountContent 。
  5. 在组件挂接到宿主 View 之前运行 @OnMount 。
  6. 在组件挂接到宿主 View 后运行 @OnBind 。
  7. 在将组件从宿主 View 分离之前运行 @OnUnbind 。
  8. 在组件从宿主 View 分离后,选择性运行 @OnUnmount 。
    还是以例子为主:
@MountSpec(poolSize = 12, canPreallocate = true)
object GlideImageSpec {private val TAG = "GlideImageSpec"/*** 在组件挂接到宿主 View 之前运行*/@OnCreateMountContentinternal fun onCreateMountContent(c: Context): ImageView {val imageView = ImageView(c)imageView.scaleType = ImageView.ScaleType.CENTER_CROPreturn imageView}/*** 在布局计算之前运行*/@OnPrepareinternal fun onPrepare(context: ComponentContext, @Prop imageUrl: String, load: Output<RequestBuilder<Drawable>>) {Log.d(TAG, "onPrepare: $imageUrl")val requestBuilder = Glide.with(context.androidContext).load(imageUrl)val apply = requestBuilder.apply(RequestOptions())load.set(apply)}/*** 在组件挂接到宿主 View 之前运行*/@OnMountinternal fun onMount(context: ComponentContext, imageView: ImageView, @FromPrepare load: RequestBuilder<Drawable>) {Log.d(TAG, "onMount: load:$load")load.into(imageView)}
}

主要是一个以Glide加载网络图片的组件,下面我们看一下使用,并对Component添加点击事件:

@LayoutSpec
object ImageViewComponentSpec {@OnCreateLayoutfun onCreateLayout(c: ComponentContext, @Prop title: String, @Prop content: String,@Prop imgUrl: String, @Prop click: String): Component {return column(c){paddingDip(YogaEdge.ALL, 16f)backgroundColor(Color.WHITE)child(text(c){text(title)textSizeSp(40f)})child(text(c){text(content)textSizeSp(20f)})//GlideImage加载网络图片child(GlideImage.create(c).widthDip(200f).heightDip(200f).imageUrl(imgUrl).build())//添加点击事件clickHandler(ImageViewComponent.onClick(c, click))}}/*** 注解点击事件的回调*/@OnEvent(ClickEvent::class)fun onClick(c: ComponentContext, @FromEvent view: View, @Param someProp: String) {Toast.makeText(c.applicationContext, "click:$someProp", Toast.LENGTH_SHORT).show()}
}

代码很简单,GlideImage的使用一目了然,不用再解释,添加点击事件也和android注解方式添加类似。主要是通过EventHandler这个事件控制器,下篇Litho下拉刷新和上拉加载也会遇到这个类,会稍微介绍一下,自己有兴趣也可以看一下源码,并不是很复杂。
同样使用,也很简单:

  //内容+图片(加载网络)的Component,并添加点击事件val imageViewComponent = ImageViewComponent.create(cc).title("title").content("content").click("here").imgUrl("http://pic37.nipic.com/20140113/8800276_184927469000_2.png").build()setContentView(LithoView.create(this,imageViewComponent))

好了,本篇介绍一下Litho的基本使用,下篇介绍一下日常操作:Litho中的RecycleView。
附上demo地址:LithoDemo

Litho的使用--基本使用及加载网络图片相关推荐

  1. iOS开发swift版异步加载网络图片(带缓存和缺省图片)

    iOS开发之swift版异步加载网络图片 与SDWebImage异步加载网络图片的功能相似,只是代码比较简单,功能没有SD的完善与强大,支持缺省添加图片,支持本地缓存. 异步加载图片的核心代码如下: ...

  2. 【转载】一行代码加载网络图片到ImageView——Android Picasso

    原文链接:一句代码加载网络图片到ImageView--Android Picasso  注意:此处使用下面代码需要先配置一下gradle,下载所需包. 具体操作如下图: compile 'com.sq ...

  3. ios开发多线程篇--异步加载网络图片GCD

    一.异步加载网络图片 1.ATS (1)简介 从iOS9.0开始,如果按照以前的方式写代码,在访问网络的时候 ,会报以下警告信息: App Transport Security has blocked ...

  4. 【Flutter】Image 组件 ( 加载网络图片 | 加载静态图片 | 加载本地图片 | path_provider 插件 )

    文章目录 一.加载网络图片 二.加载静态图片 三.加载本地图片 四.完整代码示例 五.相关资源 一.加载网络图片 参考 [Flutter]Image 组件 ( Image 组件简介 | Image 构 ...

  5. Android Volley完全解析2:使用Volley加载网络图片

    原文链接:http://blog.csdn.net/guolin_blog/article/details/17482165,CSDN 郭霖 在上一篇文章中,我们了解了Volley到底是什么,以及它的 ...

  6. android listview动态加载网络图片不显示,Android Listview异步动态加载网络图片

    Android Listview异步动态加载网络图片 详见: http://blog.sina.com.cn/s/blog_62186b460100zsvb.html 标签: Android SDK ...

  7. Universal-Image-Loader,android-Volley,Picasso、Fresco和Glide开源组件加载网络图片的优缺点比较...

    在android中的加载网络图片是一件十分令人头疼的事情,在网上有着许多关于加载网络图片的开源库,可以让我们十分方便的加载网络图片.在这里我主要介绍一下我自己在使用Volley, Picasso, U ...

  8. android imageview 设置网络图片,ImageView加载网络图片

    android网络加载图片框架Android-Universal-Image-Loader功能非常强大,其开源地址https://github.com/nostra13/Android-Univers ...

  9. 【WPF】wpf image控件加载网络图片不显示问题,

    1.加载网络图片到内存system.drawing.image对象中 2.内存中的image 转Bitmap 再转适合system.windows.controls.image 的BitmapImag ...

最新文章

  1. maven私有库搭建
  2. 怎么为DNS大哥减轻压力?
  3. StatsD!次世代系统监控的核心
  4. Mathtype写分段函数的方法
  5. 4.1.8 文件保护
  6. JavaScript——易班优课YOOC课群在线测试自动答题解决方案(八)功能面板
  7. Leetcode 数据结构与算法题解大全——目录(推荐收藏,持续更新)
  8. 学习笔记day5:inline inline-block block区别
  9. java 当前时间格式_java 处理时间的各种方式——获取时间——时间格式化
  10. java ee自学路线
  11. 计算机等级考试二级Python讲座(三)
  12. Android开发基础(四大组件及Intent)
  13. 《算法导论》——矩阵乘法的Strassen算法
  14. Podfile 文件模板
  15. 计算机开机密码输入不了,win10开机密码输入不了,win10开机密码输入没反应
  16. freyja 将引入“分组”概念进一步提高维护缓存时的效率
  17. 如何将png格式的图片缩小?png怎么缩小kb?
  18. STM32超低功耗入门之唤醒
  19. ftp服务器上传文件卡顿,FlashFXP连接FTP服务器很慢,原因可能是这样
  20. python中如何打开csv文件_Python如何读取csv文件

热门文章

  1. 16进制颜色值转RGB颜色值
  2. 单墫老先生提出的问题的初步思考
  3. 【每日面试】2021字节跳动番茄小说Java二面
  4. 【seafile服务器配置】
  5. java 全局变量 加锁_Java锁机制(一)synchronized
  6. 2021-02-02 PMP 群内练习题 - 光环
  7. 自动聚焦清晰度评价指标算法
  8. 字节流和字符流的区别
  9. 《Java基础视频-深入浅出精华版视频》视频下载及视频介绍
  10. IE浏览器被黑的有多惨,看看这些图片就知道了