使用 Glide 在 Compose 中加载图片

在公司业务引入 Compose 到现在也有一年了,图片加载这一块一直是 UI 基础设施的常聊话题,这期聊一下这段时间我们在 Compose 加载图片上的一些方案尝试,以及这个过程遇到的一些问题。 Compose 基础图片加载 首先我们要先认识一下 Compose 基础库加载图片的方式,以及 Painter。 Painter 是 Compose 中一个可绘制内容的抽象类型,它可以通过一些机制去配置绘制内容的透明度、颜色过滤器、绘制内容的测量大小、以及绘制方向等。 常见的 Painter 类型有: ColorPainter 绘制纯颜色 BrushPainter 绘制渐变色 BitmapPainter 绘制 Bitmap VectorPainter 绘制矢量图 Compose 中绘制图片大多也是依靠 Painter(但不是强依赖),通过 painterResource 方法就可以将本地的资源 id 加载成 Painter 给 Image 控件绘制。例如下面的代码就可以在 Content 这个控件中显示一个 App 内的资源图片。 @Composable fun Content() { Column( modifier = Modifier.fillMaxSize(), verticalArrangement = Arrangement.Center, horizontalAlignment = Alignment.CenterHorizontally ) { Text("Image Compare") Image( painter = painterResource(R.drawable.compose), modifier = Modifier.size(50.dp), contentScale = ContentScale.Crop, alignment = Alignment.Center, contentDescription = null ) } } 这里可以看出两个问题: ...

October 31, 2024 · korilin

Jetpack Compose 探索

Why compose Compose UI 的编写只需要 Kotlin,在遵循 Android 应用架构时,这样更有利于聚合 UI Elements 的代码,不需要去区分 Kotlin 代码和 xml 布局文件,在我看来这种方式更加容易采用 Android 架构指南去控制项目架构。 但从另一方面来讲,Compose 这种嵌套的 UI 组合方式会加深代码层次,因此开发过程中需要对 UI 上各个元素做更细的区分,以增加代码的可读性。另外如果状态使用没有处理好,也会对 Compose 的重组性能带来影响。 完善的声明式 UI Android View 系统设计的时候是遵循 OOP 的,虽然有 XML 可以帮我们减少下面这种命令式代码的使用,但这种声明式构建 + 命令式执行的缺点还是很明显,因为需要一个加载器把布局转化到业务逻辑代码中。 // 命令式 val parent = ViewGroup(); val node = View(); parent.addView(node); 如果按照理想的声明式 UI 编写方式去改造传统 View 系统,那呈现出的代码可能会包括下面两个特点: 节点的构建不应该有返回值 节点的连接不依赖于 API <LinearLayout> <TextView>Hello World</TextView> <MaterialButton android:onCLick="syaHi()">hi</MaterialButton> </LinearLayout> 将上面的布局代码转换为 Java/Kotlin 理想的声明式代码 LinearLayout { TextView("Hello World") MaterialButton("Hi") { syaHi() } } Compose 利用 Kotlin DSL 构建声明式 UI,一个 @Composable 相当于一个节点,在内部也可以调用其他 @Composable 函数构建子节点。 ...

July 8, 2022 · korilin