Jetpack Compose(9)——自定义Composable
一、Composable 组件渲染流程 传统 View 体系中,视图的渲染流程可以分为三个步骤: 测量、布局、绘制。在 Compose 中,组件的渲染流程也可划分为三步:组合、布局、绘制。 组合:执行Composable函数体,生成并维护LayoutNode视图树。 布局:对于视图树中的每个LayoutNode进行宽高尺寸测量并完成位置摆放。 绘制:将所有LayoutNode...
一、Composable 组件渲染流程 传统 View 体系中,视图的渲染流程可以分为三个步骤: 测量、布局、绘制。在 Compose 中,组件的渲染流程也可划分为三步:组合、布局、绘制。 组合:执行Composable函数体,生成并维护LayoutNode视图树。 布局:对于视图树中的每个LayoutNode进行宽高尺寸测量并完成位置摆放。 绘制:将所有LayoutNode...
前言 所谓嵌套滚动,就是两个组件之间出现滚动事件冲突了,要给与特定的处理逻辑。在传统 View 系统中称之为滑动冲突,一般有两种解决方案,外部拦截法和内部拦截法。在 Jetpack Compose 中,提供了 Modifier.nestedScroll 修饰符用来处理嵌套滚动的场景。 一、Jetpack Compose 中处理嵌套滚动的思想 在介绍 Modifier.nestedScrol...
本文介绍 Jetpack Compose 中的手势处理。 官方文档的对 Compose 中的交互做了分类,比如指针输入、键盘输入等。本文主要是介绍指针输入,类比传统 View 体系中的事件分发。 说明:在 Compose 中,手势处理是通过 Modifier 实现的。这里,有人可能要反驳,Button 这个可组合项,就是专门用来响应点击事件的,莫慌,接着往下看。 一、点按手势 1.1 ...
本文介绍 Jetpack Compose 动画。 官方文档 关于动画这块,第一次看官网,觉得内容很杂,很难把握住整个框架结构,很难去对动画进行分类。参考了很多文献资料,大多数都是从高级别 API 开始讲解,包括官网也是如此。我发现这样不太容易理解,因为高级别 API 中可能会涉及到低级别 API 中的一些方法,术语等。所以本文从低级别 API 讲起。 一、低级别动画 API 1.1 ani...
一、 Composable 的生命周期 Composable 组件都是函数,Composable 函数执行会得到一棵视图树,每一个 Composable 组件对应视图树上的一个节点。Composable 的生命周期定义如下: onActive(添加到视图树) Composable 首次被执行,即在视图树上创建对应的节点。 onUpdate(重组) Composable 跟随重组不...
上一篇文章讲了 Compose 中状态管理的基础知识,本文讲解 Compose 中状重组的相关知识。 一、状态变化 1.1 状态变化是什么 根据上篇文章的讲解,在 Compose 我们使用 State 来声明一个状态,当状态发生变化时,则会触发重组。那么状态变化是指什么呢? 下面我们来看一个例子: @Composable fun NumList() { val num by re...
上一篇文章拿 TextField 组件举例时,提到了 State,即状态。本篇文章,即讲解 State 的相关改概念。 一、什么是状态 与其它声明式 UI 框架一样,Compose 的职责非常单纯,仅作为对数据状态的反应。如果数据状态没有改变,则 UI 永远不会自行改变。在 Compose 中,每一个组件都是一个被 @Composable 修饰的函数,其状态就是函数的参数,当参数不变,则函...
一、项目中使用 Jetpack Compose 从此节开始,为方便起见,如无特殊说明,Compose 均指代 Jetpack Compose。 开发工具: Android Studio 1.1 创建支持 Compose 新应用 新版 Android Studio 默认创建新项目即为 Compose 项目。 注意:在 Language 下拉菜单中,Kotlin 是唯一可用的选项,因为 ...
写在前面 Jetpack Compose 已经不是什么新技术了,Google 早在 2019 年就推出 Jetpack Compose 的首个 alpha 版本,时至今日,相当大比例的国内 Android 开发者还没有学习使用过。本篇文章主要介绍 Jetpack Compose 的一些发展背景,接下来会有一个系列的文章,来逐步讲述 Jetpack Compose 的一些知识点。 一、Jet...
一、引出问题 你是否有在使用 Gson 序列化对象时,见到如下异常: Abstract classes can't be instantiated! Register an InstanceCreator or a TypeAdapter for this type. 什么时候会出现如此异常。下面举个栗子: import com.google.gson.Gson import com...