一条咸鱼的2022 | 掘金 & 开源 & 项目
Hi 各位好,我是咸鱼。第一次尝试动笔,总结过去的一年,也算一种奇妙的感受吧。
咸鱼我的 ID 是 “FunnySaltyFish”,直译过来是 “有趣的咸鱼”,或者 “滑稽的咸鱼”。这当然带有一点自嘲的属性。做一条咸鱼代表着我的生活态度:不做计划、没有规划、过一天是一天;但也有另一方面:也不能一直躺着,躺久了这一面就糊了,总该翻翻身,做点什么。于是便想想回忆一下,看看过去一年终究是做了些什么。
掘金如果翻看我的文章列表,第一篇的时间定格在2020年8月。那是我主要混迹于 C**N,偶然间了解到掘金这个平台,于是便随手注册了个账号,丢了两篇文章过来。现在回过头看,那两篇文章都创作于我的高中时期,还是用手机码出来的,字里行间承载着属于年轻人独特的骚气,也算是某种程度的黑历史了(笑)。正式开始在掘金写作要到 2021年7月,那时恰逢 Jetpack Compose 发布 Beta 版,我开始接触这一新技术。彼时国内关于这方面的中文资料非常少(可以说是几乎没有),而我又受够了 C**N 漫天垃圾的氛围,于是便跑到之前偶然注册的掘金,想着看一看。令人惊奇的是,我之前随意投稿的两篇文章竟然都被推 ...
Jetpack Compose 十几行代码快速模仿即刻点赞数字切换效果
缘由四点多刷掘金的时候,看到这样一篇文章:自定义View模仿即刻点赞数字切换效果,作者使用自定义绘制的技术完成了数字切换的动态效果,也就是如图:
两图分别为即刻的效果和作者的实现
不得不说,作者模仿的很像,自定义绘制玩的炉火纯青,非常优秀。不过,即使是这样简单的动效,使用 View 体系实现起来仍然相对麻烦。对上文来说,作者使用的 Kotlin 代码也达到了约 170 行。
Composable如果换成 Compose 呢?作为声明式框架,在处理这类动画上会不会有奇效?
答案是肯定的!下面是最简单的实现:
12345678910111213Row(modifier = modifier) { text.forEach { AnimatedContent( targetState = it, transitionSpec = { slideIntoContainer(AnimatedContentScope.SlideDirection.Up) with ...
Jetpack Compose 上新:瀑布流布局、下拉加载、DrawScope.drawText
不久前,Jetpack Compose 发布了 1.3.0 正式版。经过一年多的发展,再回头去看,Compose 终于带来了缺失已久的瀑布流布局以及DrawScope.drawText方法。本文就简单介绍一下。截止此文写作时,Jetpack Compose 的最新 stable 版本为 1.3.1,而查阅 Compose 与 Kotlin 的兼容性对应关系 文档可知,此版本对应的 Kotlin 版本为 1.7.10。如需尝试部分代码,请确保对应版本设置正确。
BOMCompose Bill of Materials 是 Compose 最近带来的新东西,它能帮你指定 Compose 各种库的版本,确保各个 Compose 相关的库是项目兼容的(但并不引入对应的库)。具体来说,当你在 build.gradle 中引入 BOM 后
12// Import the Compose BOMimplementation platform('androidx.compose:compose-bom:2022.10.00')
再引入其它 Compose 相关的库就不需要手动指定版 ...
Python 3.11.0 正式发布!主要新特性一览
去年(2021)的 10 月份,Python 发布了 3.10.0 正式版,我也在第一时间做了介绍(相关文章);一年后的几天前,Python 3.11.0 正式版也亮相了。目前的下载链接:https://www.python.org/downloads/release/python-3110/下面就让我们看一下主要的新特性吧。
快3.11 带来的最直观变化就是,Python 更快了。官方的说法是能带来 10%~60% 的提速,在基准测试上平均达到了 1.22x。更细致的介绍请参见 What’s New In Python 3.11 — Python 3.11.0 documentation。
下面摘录其中部分提升
操作
形式
限定
最大加速
贡献者(们)
二元运算
x+x; x*x; x-x;
Binary add, multiply and subtract for common types such as int, float, and str take custom fast paths for their underlying types.
10%
Mark Sha ...
入坑 Jetpack Compose :写一个简单的计算器
本文是一个综合的Compose小例子,涉及动画、自定义布局、列表等主题。本文并非教程,只是展示展示Compose开发应用是什么感觉,并试图拉人入坑。如果你还没接触过,不妨进来扫一扫代码,读一读单词,感受感受~本文所展示的思路仅为个人想法,并不代表最优解,也欢迎一起探讨
前言8月份的时候,我关注了 fundroid 大佬的公众号,看到历史推文中有这么一篇,内容是Compose学习挑战赛,要求为“实现一个计算器 App”。正好自己对Compose有过一点经验 (这个可以点开头像看历史文章),抱着试试看的态度,我花大概4-5h完成并提交了作品。尽管作品比较简单,但结果还是不错的(补充:看了看评论区大佬的图,发现这是个参与纪念奖 hhh):几天前,我收到了Google发来的这封邮件:
既然文章都写完了,那还是厚着脸皮留着吧所以就简单介绍下吧,或许也可以当做非常入门的小案例,说不定能帮到些人、拉入点坑。本文源码地址见文末
效果可以看到,尽管开发的时间并不长,但是基本的小功能也还是有的。计算的时候也会有点简单的小动画,还适配了横屏的布局。顺带一提,由于Compose天然的特性,项目还自动适配 ...
写出更现代化的Python代码:聊聊 Type Hint
Type Hint是 Python 3.5 新增的支持,中文可以译为 类型提示。屏幕前的你或许听过,又或许没有。所以今天,让我们一起了解了解。本文基于 Python 3.10.4,部分代码需要在 Python 3.10.0 及以上运行,原因在后续文章中会有说明本文的代码编辑器为 VS Code ,您可以选择其他现代编辑器/IDE以体验
为什么需要 Type Hint简而言之,按我的理解,type hint的目的是写给“别人”看。这个“别人”,就包括代码编辑器、其他阅读代码的人和几天后的你自己。废话不多说,Show You My Code!
开始写代码现在我们假设,你想写一个函数,用处是统计给定字符串中某个字符出现的次数,于是你大手一挥,写下了这样的代码:
12def count_char(text, char): return text.啥来着???
尴尬的是,你记得str类有这个方法,但却忘记了这个方法叫啥了,看看编辑器的自动提示?
遗憾的是,编辑器不知道你的text是啥类型的,自然没法帮你补全。那我们能不能告诉它:这是个str呢?可以,给参数名后面加个: str就好 ...
Compose 数据持久化辅助框架:ComposeDataSaver 的一些新变化
七个月前,我写了个用于辅助 Jetpack Compose 做数据持久化的框架,并把它放到了 Github 上。在当时,我还写了篇简单的文章介绍:Jetpack Compose 中优雅完成数据持久化。七个月后,我对它进行了大更新。这篇文章,再来推广推广它。
嘿嘿嘿,不妨看看,说不定有点用呢~
为什么写这个框架写这个框架是基于这样一个很简单的思想:
我们知道,在Compose中,函数会被反复调用(也就是重组)。所以如果要记住一个状态,需要remember{ }。也就是这样:
12345 var number by remember{ mutableStateOf(1) } ... onClick = { number++ }
再进一步呢?如果需要页面横竖屏切换时还记住它,我们就需要用到记得更持久一些的rememberSaveable。也就是这样
12345 var number by rememberSaveable { mutableStateOf(1) } ... onClick = ...
写出优雅的Kotlin代码:聊聊我认为的 "Kotlinic"
“Kotlinic” 一词属于捏造的,参考的是著名的”Pythonic”,后者可以译为“很Python”,意思是写的代码一看就很有Python味。照这个意思,”Kotlinic”就是“很Kotlin”,很有Kotlin味。
Kotlin程序员们不少是从Java转过来的,包括我;大部分时候,大家也都把它当大号的Java语法糖在用。但Kotlin总归是一门新语言,而且,在我眼里还是门挺优雅的语言。所以,或许我们可以把Kotlin写得更Kotlin些。我想简单粗浅的聊聊。
本文希望:聊聊一些好用的、简洁的但又不失语义的Kotlin代码
本文不希望:鼓励无脑追求高超技巧,完全放弃了可读性、可维护性,全篇奇技淫巧的操作
受限于本人水平,可能有错误或不严谨之处。如有此类问题,欢迎指出。也欢迎在评论区探讨交流~
善用with、apply、also、letwith和applywith和apply,除了能帮忙少打一些代码外,重要的是能让代码区分更明确。比如
123456 val textView = TextView(context) textView.text = "fish" ...
Jetpack Compose 性能优化参考:编译指标
本文译自:https://chris.banes.dev/composable-metrics/原标题:Composable Metrics译:FunnySaltyFish
本文为文章《如何在 Jetpack Compose 中调试重组》中附录的文章,译者同样进行了翻译。限于译者水平,不免有谬误之可能,如有错误,欢迎指正。
当一个团队开始使用 Jetpack Compose 时,他们中的大多数人最终会发现少了一块拼图:如何测量可组合项(Composable)的性能。
在 Jetpack Compose 1.2.0中,Compose 编译器添加了一个新功能,它可以在构建时输出各种与性能相关的指标,让我们能够窥视幕后,看看潜在的性能问题在哪些地方。在这篇博文中,我们将探索新的指标,看看我们能找到什么。
在开始阅读之前需要了解的一些事项:
最终写完后的结果显示,这是一篇很长 的博文,涵盖了 Compose 的许多工作原理。所以阅读这篇文章可能得花点时间。
本文仅仅设立了一些预期,到结尾也没有真正做成什么“明显的成效”😅。但是,希望您能更好地了解您在设计上的选择将如何影响 C ...
【杂谈】我用 Jetpack Compose 的这一年
关于这篇文章,其实本来并没有什么写作计划。触发它诞生的事情是,今天早上,QQ空间给我推了这样一条消息:
一年前的今天,我敲下了第一行的Hello Android for Jetpack Compose,而到今天,我的个人小项目 译站 早已全面转向 Jetpack Compose 。关于 Compose,我也写了几个简易的开源库、作了几篇小文章。所以今天,不妨来谈谈我接触 Compose 的这一年。
本文 不是技术文 ,其中观点仅代表我个人。受限于本人技术水平,难免有误,还望您包容谅解
初我接触 Compose 的时间应该还算较早,虽然不是最早的一批,但也算是那时的少数(至少我以为)。彼时,Google 发布 beta 版本,尚且只有 AS 的 Beta 版本支持。为了体验,我将一直使用的AS Stable切成了AS Beta,用默认模板敲出了第一行代码。
我是一个对新技术很感兴趣的人,这可能也是我去学习 Compose 的原因。声明式UI的概念虽然相较View很新奇,但鉴于我接触过Vue和Flutter,所以也还能上手。
上手是可以上手,但奈何资料确实不多,尤其是中文的。对我来说,早 ...