})
Image(image, modifier = imageModifier, contentScale = ContentScale.Crop)
Spacer(modifier = Modifier.preferredHeight(16.dp))
Text(“Hello Compose!”)
}
}
4. Compose 界面结构
通过上面的介绍,对 Compose 有了一个初步的认识,那么 Compose 函数如何绘制在屏幕上的呢?以什么样的形式展示的呢?我们使用 Layout Inspector 工具查看一个 Compose 页面。
[图片上传中…(image-58ed43-16111825900-1)]
通过左侧的布局结构可以发现,Compose 框架中已经废弃原有的 View 体系中的控件(TextView、Button、ImageView 等),而是使用 AndroidComposeView(继承 ViewGroup)、ViewLayerContainer(继承 ViewGroup)和 ViewLayer(继承 View) 控件实现,其中 ViewLayer 代表每个 View 控件视图。
查看 ViewLayer 的调用关系,可以得到视图的生成关系:LayerWrapper → AndroidComposeView -> ViewLayer。
5. Compose 对业务的影响
Jetpack Compose 是一个适用于 Android 的新式声明性界面工具包,同时点击监听的设置方式也发生较大变化,那么对于我来说,最直观的业务影响是无法继续使用原有的插码技术进行点击事件的采集。这块需要进行调研适配。
上面提到设置点击的两种方式,本质上都是通过 Modifier 进行实现,来看下面的一个例子。
@Composable
fun ClickedText() {
val modifier = Modifier.clickable(onClick = {
Log.d(“Andoter”, this.javaClass.name)
Toast.makeText(this@MainActivity, “Button 点击”, Toast.LENGTH_SHORT).show()
})
Text(text = “Hello Compose!”, modifier = modifier.padding(10.dp))
}
通过 Modifier 给一个 Text 设置点击监听,在点击的时候弹出一个 Toast。反编译看看最后的实现。
/* access modifiers changed from: package-private */
@Metadata(mo23161bv = {1, 0, 3}, mo231k = 3, mo23165mv = {1, 4, 0})
/* compiled from: MainActivity.kt */
public final class MainActivity$TextButton$1$1 extends Lambda implements Function0 {
private final /* synthetic */ MainActivity $this;
/* JADX INFO: super call moved to the top of the method (can break code semantics) */
MainActivity$TextButton$1$1(MainActivity mainActivity) {
super(0);
this.$this = mainActivity;
}
@Override // kotlin.jvm.functions.Function0
public final void invoke() {
Log.d(LiveLiterals
M
a
i
n
A
c
t
i
v
i
t
y
K
t
.
I
N
S
T
A
N
C
E
.
m
o
17059
x
27
d
b
7
f
d
e
(
)
,
t
h
i
s
.
MainActivityKt.INSTANCE.mo17059x27db7fde(), this.
MainActivityKt.INSTANCE.mo17059x27db7fde(),this.this.getClass().getName());
Toast.makeText(this.
t
h
i
s
,
L
i
v
e
L
i
t
e
r
a
l
s
this, LiveLiterals
this,LiveLiteralsMainActivityKt.INSTANCE.mo170x88044b3e(), 0).show();
}
}
Kotlin 经过处理最终是转换成一个继承 Lambda 并实现 Fuction0 接口的类来托管实现点击监听。这样我们就可以总结出 Hook 条件:
-
kotlin.jvm.internal.Lambda 的子类
-
实现 kotlin.jvm.functions.Function 接口
-
被 public 和 final 修饰符的 invoke 方法
尽管 Hook 点找到了,但是目前还无法突破获取对应的 View,依托 View 读取的属性就无法获取。希望可以一起跟你探讨下。
6. 总结
长期以来,Android 视图层次结构一直可以表示为界面微件树。界面更新方式是使用 findViewById() 等函数遍历树,这种手动操纵视图的方式会提高出错的可能性。在过去的几年中,移动端已开始转向声明性界面模型,比如 Flutter、Swift UI,所以 Jetpack Compose 框架应该也是后续发展的一个方向。
客观地讲,Compose 确实是一套比较难学的东西,因为它毕竟太新也太大了,它是一个完整的、全新的框架,确实让很多人感觉「学不动」,这也是个事实。
那怎么办呢?学不动怎么办呢?
如果你是因为缺少学习资料,而我正好薅到这本谷歌内部大佬根据实战编写的《Jetpack Compose 最全上手指南》,从入门到精通,教程通俗易懂,实例丰富,既有基础知识,也有进阶技能,能够帮助读者快速入门,是你学习Jetpack Compose的葵花宝典,快收藏起来!!!
第一章 初识 Jetpack Compose
1. 为什么我们需要一个新的UI 工具?
2. Jetpack Compose的着重点
-
加速开发
-
强大的UI工具
-
直观的Kotlin API
3. API 设计
4. Compose API 的原则
-
一切都是函数
-
顶层函数(Top-level function)
-
组合优于继承
-
信任单一来源
5. 深入了解Compose
6. 插槽API
第二章 Jetpack Compose构建Android UI
1. Android Jetpack Compose 最全上手指南
2. 深入详解 Jetpack Compose | 优化 UI 构建
-
Compose 所解决的问题
-
Composable 函数剖析
-
声明式 UI
-
组合 vs 继承
-
封装
-
重组
-
……
3. 深入详解 Jetpack Compose | 实现原理
第三章 Jetpack Compose 项目实战演练(附Demo)
1. Jetpack Compose应用1
2. Jetpack Compose应用2
3. Jetpack Compose应用做一个倒计时器
-
数据结构
-
倒计时功能
-
状态模式
-
Compose 布局
-
绘制时钟
4. 用Jetpack Compose写一个玩安卓App
-
准备工作
-
引入依赖
-
新建 Activity
-
创建 Compose
-
PlayTheme
-
画页面
-
底部导航栏
-
管理状态
-
添加页面
5. 用Compose Android 写一个天气应用
自我介绍一下,小编13年上海交大毕业,曾经在小公司待过,也去过华为、OPPO等大厂,18年进入阿里一直到现在。
深知大多数Android工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则几千的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!
因此收集整理了一份《2024年Android移动开发全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。
既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,基本涵盖了95%以上Android开发知识点,真正体系化!
如果你觉得这些内容对你有帮助,可以添加V获取:vip204888 (备注Android)
学习分享
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
oid)**
[外链图片转存中…(img-826qUApl-17126036668)]
学习分享
①「Android面试真题解析大全」PDF完整高清版+②「Android面试知识体系」学习思维导图压缩包
[外链图片转存中…(img-RatdAwe7-17126036669)]
[外链图片转存中…(img-8QTPR6Rf-17126036669)]
[外链图片转存中…(img-KRX2XOsN-17126036669)]
一个人可以走的很快,但一群人才能走的更远。不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎扫码加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
[外链图片转存中…(img-Yiy3f4lq-17126036669)]