当我第一次通过Kotlin和Compose来完结一个Canvas时, 我收成了什么?

自从2019年Google推荐Kotlin为Android开发的首选言语以来现已阅历了将近四年的时间, Compose的1.0版别也发布了将近2年的时间, Kotlin+Compose在现阶段的Android开发进程中还远远达不到干流的程度. 咱们是否应该开端测验这个组合? 这个组合又会给咱们带来什么?

关于我来说, 我是个保守又喜新的人, 自2018初我就测验用Kotlin来完结一些Android的工作了(Android For Bezier), 可是一向没有将kotlin作为我个人的Android首要开发言语. 不过随着Kotlin+Compose这个组合社区的完善, 越来越多的人开端测验这个组合, 并为这个组合的社区构建添了加自己的一份力. 得益于Kotlin和Java之间能够无感的互相调用, 越来越多的人(包括我)开端测验将Kotlin或Kotlin+Compose加入到现有的开发项目中, 本文将展示一些我在这个组合中遇到的收成和考虑.

从一个自定义Canvas开端

先看下作用, 动画原始作用非原创, 在结合实践功用作用的情况下进行了二次规划.

当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

终究的完结结果仍是比较满意的, 额外的添加了许多的动画作用. 或许说, 显现的每个部分都是有自己的动画的.

先说说收成和考虑

一般来说我都会从规划到代码的完结进程顺次解说, 可是这次我先讲收成和考虑的原因, 首要是因为整个规划到代码完结的进程在全体上和原来的开发(Java)没有什么本质的差异. 当然, 后面仍然会供给对这个动画的具体说明.

  1. Kotlin和Java Kotlin和Java之间的比较和联系我就不多赘述了, 不过通过在这个Canvas的Coding进程中, 关于Kotlin的运用和了解有着更深化的了解. 比较时两种言语, 尽管两者的联系非常的亲近, 可是在真实运用的运用, 仍是要避免将一种言语的习惯带入到另一种.

  2. Compose 开始的我项做一个通过Compose来完结的gist desktop工具, 不过其时的种种问题和材料的短少让我终究没有完结这个项目. 当我真实在项目中运用Compose后, 咱们才干了解Compose运用怎么运用, 仅靠他人的介绍是完完全全达不到的体验作用. 这个对大多数一向深耕于Android的开发者们来说是非常显着的.

    其间首当其冲的便是响应式布局的思路, 和咱们开始运用的xml布局所带来的习惯其间的差异是非常巨大的.

    当咱们通过xml来完结咱们的布局时(乃至咱们直接通过 View.add() 构建的时分), 咱们都是先创建一个View, 咱们持有这个View的”凭据”, 咱们能够通过这个”凭据”来对这个View在任何时间任何地址做任意的修正.

    而当咱们运用Compose进行布局的时分, 咱们需求现将Compose(Compose 便是Compose, 它和View是同级的)定义好, 告诉它应该在什么情况下需求做什么. 就像玉兔号相同, 在地面的时分你能够为他添加各种的工具(履带, 摄像头…), 可是当你把它发射都月球上后, 哪怕是改一下表面的斑纹都无法做到了.

    开始的Coding进程中, 由于固有思路的原因, 想着先完结一部分的功用, 然后看下完结的作用在逐步添加相关的功用. 可是当我完结了某个作用再回来的时分, 在一小部分的情况下, 我不得不对现有的代码进行很大的修正. 同时我也确认过, 假如不运用Compose的话, 是不需求改动如此大的. 这儿便是我在这个项目中对我观念改变最大的当地. “假如没有规划完结, 就不要去完结它”, 平时的这个问题被咱们拿住”凭据”的View所掩饰了.

    换句话说, 运用Compose就像运用各种Builder相同, 当咱们没有build()的时分, 咱们能够做任何事情, 一旦咱们完结build()了, 咱们就不能这样为所欲为的控制它, 想想咱们的AlertDialog.Builder().create().

  3. Kotlin Compose和Java XML 在整个代码中, 我都尽量运用Kotlin+Compose来进行完结各种功用, 就像Kotlin和Java直接能够很方便的互相运用, Compose和View直接也能够很简略的互相融合, 在Coding进程中, 经历的不足和对Kotlin Compose的不熟悉使得许多看似简略的功用迟迟无法完结, 乃至一些作用对我来说, 不运用老方法我无法做到. (即便如此, 仍运用了一部分ValueAnimator而不是 rememberInfiniteTransition)

  4. 会让我更多的运用Kotlin和Compose么? 通过一段时间的运用后(不仅仅是这个demo, 还有在实践工作中的运用), 我以为我会测验更多的Kotlin代码和用Compose来构建页面. 通常来说的Kotlin相关于Java来说代码量会更少, 不过现在的各种辅佐开发工具(Copilot, ChatGpt)使其”写更少的代码”看起来并不是非常能吸引人, 俗语说的好”纸上得来终觉浅,绝知此事要躬行”, 当你真实的运用一段时间之后, 你会发现写的少, 不仅仅是写的少, 也代表了看的少, 了解的少, 改的少, 保护的少.当然, 这些都是建立在必定基础上的, 在了解必定的特性和约好后才干达到, 不然最多的感受可能只要”这儿的功用是什么? 这儿为什么要这么规划?”, (是吧 协程).

    假如说Java的学习难度是线性的, 那么Kotlin的学习难度我以为是抛物线的形状, 入门比Java更简略, 可是稍一深化, 由于有许多约好的特性, 使其间期难度比Java更难. 当然, 后期深化通晓的部分都是需求不断的学习和运用的.

    这导致了许多人初期运用的时分感觉很省心, 可是当测验运用或许深化学习的时分, 会发现许多的当地都无从下手, 或许预期的功用无法完结. 一是固有思维的作祟, 二是你以为学习完结的基础知识还不足以让你进行下一步. 这可能便是”基础知识圈套”吧. 开始的我, 以为Kotlin是Java的另一种完结形式, 以为直接的测验是没有问题的. 可是就像是View和Compose直接的联系相同, 尽管两种之间都能够很轻易的互相运用, 可是, View便是View, Compose便是Compose, Kotlin便是Kotlin, Java便是Java. 两者之间的联系并不是替代和补充. 而是完结同一目的的不同思路. “条条大路通罗马”不是么? 所以当你运用Kotlin和Compose的时分, 放弃一下固有的思维和观念, Kotlin不是替代品, 它是另一条路.

关于我来说, 最大的问题是不可避免的运用了原有的思路来处理新的问题, 当然, 这也是在整个进程当中考虑最多的, 多测验一下新的思路, 走出舒适圈. 才干有更大的提升.(记得规划完结了再完结, 假如你不想从头规划好几次你的代码的话.)

看看咱们的Canvas

考虑和收成都写完, 下面咱们来看看这个看起来还不错的Canvas是怎么完结的吧.

全体看来分为了四层, 分别是布景, 白日的云彩, 夜晚的星星, 以及太阳和月亮.

当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

为了能够很明确的看到canvas的规划, 布景这儿没有约束显现范围,能够看到这儿运用了四个不同半径可是圆心在同一点的圆, 用来模仿不同层级光的作用.

当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

白日的云层为了方便检查更改为了蓝色来检查. 云层的是由7个2层大小方位都不近相同的圆形绘制而成.

当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

夜晚的星星也比较简略, 在随机的方位显现菱形即可.

当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

太阳是最简略一个规划了, 只添加了一个色彩改变的作用.

当我第一次通过Kotlin和Compose来实现一个Canvas时, 我收获了什么?

月亮的规划也相对简略, 添加了一个滚动的作用.

最后来看全体的规划仍是比较简略的. 可是阴影的部分耽误了许多的时间(乃至部分作用未达到预期就没有运用).

相关的代码在[我的GitHub]中(github.com/clwater/And…)