自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(70)
  • 收藏
  • 关注

原创 Compose for iOS:kotlin 与 swift 互操作

以上就是在 compose iOS 中 swift 与 kotlin 互操作的全部内容,完整代码可见项目。本来今天是准备写在 kotlin jvm 平台调用 jni 实现和 c/c++ 的互操作的,但是遇到一点啸问题,忙活了一整天都没解决,所以就临时改为写一篇 compose iOS 中 swift 与 kotlin 互操作了。

2023-12-10 13:43:32 777 2

原创 为 Compose MultiPlatform 添加 C/C++ 支持(3):实战 Desktop、Android、iOS 调用同一个 C/C++ 代码

通过上面两个小节的讲解,相信读者也看出问题来了,这时候如果我再说调用 C 的运算速度实际上比直接使用 kotlin 还慢读者应该也恍然大悟知道什么原因了吧。其实并不是 C 本身慢,而在于我为了在调用 C 的同时复用 C 代码,做了大量的数据转换工作,而每次数据转换的代价都是极其昂贵的,这就导致运算时间反而相比于直接使用 kt 计算还要慢了。这也是我说的使用这个项目举例是不恰当的原因,因为这就相当于为了这碗醋还特意去大张旗鼓的包了顿饺子一样。

2023-12-10 13:43:01 695 1

原创 为 Compose MultiPlatform 添加 C/C++ 支持(2):在 jvm 平台使用 jni 实现桌面端与 C/C++ 互操作

在上篇文章中我们已经介绍了实现 Compose MultiPlatform 对 C/C++ 互操作的基本思路。并且先介绍了在 kotlin native 平台使用 cinterop 实现与 C/C++ 的互操作。今天这篇文章将补充在 jvm 平台使用 jni。

2023-12-10 13:42:20 505

原创 为 Compose MultiPlatform 添加 C/C++ 支持(1):在 kotlin 中使用 cinterop 实现与 C/C++ 互操作

自此我们已经能够大致了解了如何在 kotlin native 中使用 cinterop 和 C/C++ 交互,虽然我全文举例都只是在 Desktop 平台举例,但是实际上对于同样使用 kotlin native 的 iOS 平台也是一样的用法。其余地方和 Desktop 没有任何区别。下一章我们将介绍如何在 Compose MultiPlatform 中为 Desktop 和 Android 添加 jni 支持。

2023-12-10 13:41:34 1093

原创 安卓与串口通信-如何区分连接的设备?

一般来说,不管是在什么平台上需要与外接硬件交互,第一件事都是应该能够正确的识别出目标硬件。例如在 Windows 上,当一个新的外设设备被插入到我们的电脑时,系统会通过 Hardware IDs 、Compatible IDs 来确定连接的是什么设备并为其选择或安装一个合适的驱动程序以供后续使用。在获取到可用的驱动程序后 Windows 还会使用 Instance IDs 、 Device instance IDs 用于标识设备的唯一性。

2023-12-10 13:40:50 456

原创 体验一下使用 ArkUI 进行 HarmonyOS 开发并与 Compose 简单对比

经过上述的简单了解,我们可以发现,其实不管是 Android 的 Jetpack Compose 还是 Apple 的 SwiftUI 还是刚才说的鸿蒙的 ArtUI,其实核心思想都是差不多的(毕竟都是声明式 UI 的思想),对于我们普通程序员来说写起来也是差不多的感觉,无非是语法和部分风格上略微有区别。另外前言中说的事件既是段子也是一部分现实,但是还是希望各位能弄清楚自己的定位,有一个明确的规划,不要东一榔头西一棒子的看见啥有热度就学啥。当然,有余力的话多了解了解其他技术还是挺有帮助的。

2023-12-10 13:40:05 92

原创 使用 Compose Desktop 编写一个移轴摄影处理软件

移轴摄影一般指使用移轴镜头拍摄出来的照片,但是现在也有很多使用非移轴镜头拍摄但是后期处理成移轴效果的照片也被称为移轴摄影。移轴摄影的中的移轴翻译自Tilt-shift,即倾斜与位移。之所以叫这个名字是因为移轴镜头通常会平移、倾斜或旋转镜头主光轴相对于图像传感器的位置,从而达到调整被摄物的透视关系或聚焦的目的。移轴摄影通常用于拍摄建筑物全景,一般为了拍摄出建筑物的全景都会使用广角镜头,并且通常是俯拍或仰拍,这就会导致拍摄出来的建筑物“近大远小”,拍出来的建筑是严重变形的。

2023-12-10 13:39:27 196

原创 在 Android WebView 中实现和 JavaScript 的互操作

有两个参数。其中 object 即需要提供给 js 调用的对象。在 Android 4.1.2 (API 16) 以下时,js 可以调用该对象的所有公开方法;在 Android 4.2 (API 17)以上时, js 只能调用添加了注解的公开方法。之所以会有这样的改动,是因为在 API 16 之前可以调用所有公开方法具有安全隐患,例如可以利用 jave 的反射机制实现任意命令的执行。interfaceName 即 js 调用时的接口名称。我们可以通过 webview 的。

2023-12-10 13:37:33 684 1

原创 【译】快速开始 Compose 跨平台项目

Compose Multiplatform 中的 iOS 部分目前处于 Alpha 状态。以后可能会有不兼容的更改,届时也许需要手动进行迁移。你可以使用这个来开发同时支持桌面、安卓和 iOS 的。跟着接下来的教程,你将学会如何启动并运行你的第一个 Compose 跨平台项目,最终结果将是一个使用编写逻辑代码 和 使用 Compose 跨平台作为 UI 框架的项目。

2023-10-17 21:24:41 586

原创 Compose Desktop 使用中的几个问题(分平台加载资源、编写Gradle 任务下载平台资源、桌面特有组件、鼠标&键盘事件)

以上就是我最近在修改使用 Compose 实现的纯桌面端程序时发现的一些问题以及解决方法。完整的项目源码在此:。其实在修改这个程序时还发现了很多有趣的问题,但是限于这篇文章已经不短了,所以我也就不再继续写了,感兴趣的可以看看源码。

2023-10-17 21:23:09 1126

原创 Compose 实战之为下拉刷新添加自定义指示器

在上述内容中我们以为例,讲解了如何给下拉刷新组件添加自定义的指示器。可以看出,自定义下拉指示器有很大的自由度,能够使用的参数也很多,几乎可以满足我们的所有需求,能不能把指示器玩出花来完全取决于我们的想象力。当然,本文只说了如何为的下拉刷新添加自定义指示器,而没有说如何为material的添加指示器,本来我原计划是打算两个一起讲的,但是看了一下,material的下拉刷新少了几个参数,对于编写自定义指示器有点不太方便,所以我就没有继续尝试了,感兴趣的可以自己试试。

2023-10-17 21:22:24 359

原创 Kotlin 协程再探之为什么使用协程反而更慢了?

以上就是我在优化项目中运行性能时发现的一个协程的错误用法导致的运行性能反而更加低下的情况和分析。这个例子告诉我们,使用协程一定要根据需要去灵活的使用它的不同特性,而不是不管三七二十一,直接梭哈。

2023-10-17 21:21:31 500

原创 Compose Material3 新增垂直分隔符(VerticalDivider)解析与疑惑

以上就是我对 MD3 最新增加的分隔符的源码解析以及在查看源码时发现的一个令人迷惑的问题。但是目前我还是不知道为什么谷歌会这样设计,如果有大佬知道希望能不吝赐教。

2023-10-17 21:20:53 299

原创 Kotlin & Compose Multiplatform 跨平台开发实践之加入 iOS 支持

自此,我们的项目就完全移植到了完整形态的 Compose Multiplatform 中了!现在它已经完全支持 Android、iOS 和 desktop 了!不知道你们有没有发现,在全文中,我几乎都是在说怎么适配和移植逻辑代码,并没有说到有关 UI 的代码。哈哈,不是因为我忘记说了,而是因为 Compose Multiplatform 代码真的做到了一套代码,多平台通用。新增加 iOS 支持完全不用动 UI 部分的代码。

2023-10-17 21:19:44 1661 2

原创 Compose 嵌套滑动冲突的解决办法

以上就是我目前遇到的在 Compose 中的手势冲突的情况,以及我的解决方案。完整的代码在这里:可以看到其实核心思路也是和使用 view 时一样,根据我们自己实际业务需求,重新分配不同的触摸事件给不同的 UI。不过我的处理方式实在无法称作优雅,所以各位大佬如果有更优雅的处理方式,希望能不吝赐教。

2023-06-19 19:13:06 1821

原创 Jetpack Compose Material3 组件之 DatePicker(日期选择)

本文只是简要介绍了关于 Compsoe Material3 中关于日期选择的基本使用方法,更多的使用方法还需要读者自行探索。可以看到,Compose 的官方组件已经越来越多,越来越趋向于成熟。相较于正式版刚发布没多久时的什么东西都没有,什么都需要自己造轮子的状态,现在几乎已经涵盖了我们开发中常用到的各种控件和需求了。

2023-06-19 19:10:32 1989 3

原创 在 Compose 中实现缓存列表数据提升用户体验(Stale-while-revalidate)

至此,我们就实现了我们自己的。完整的 Github APP 代码可以在这里找到:但是,实际上这里代码还有一点小瑕疵,那就是我们在定义时没有使用同一个数据源,这就会导致在网络请求完成,更新数据时会全屏闪烁一下。对于这个闪烁,相信各位安卓开发大佬再熟悉不过了,在传统的安卓 view 体系中,更新诸如 RecyclerView 之类的列表 VIew 的数据时也会出现这个情况,而在传统 VIew 中解决这个情况的方式就是按需刷新列表,只刷新变动的列表项。所以在这里,我们解决 Compose 中。

2023-06-10 16:36:54 1801

原创 安卓与串口通信-数据分包的处理

其实串口通信中的分包或者粘包解决起来并不难,问题主要在于串口通信一般都是每个硬件设备厂商或者传感器厂商自己定义一套通信协议,而有的厂商定义的协议比较“不考虑”实际,没有给出任何能够区分不同数据包的标志,这就会导致我们在接入这些设备时无法正常的解析出数据包。但是也并不是说就没有办法去解析,而是需要我们具体情况具体分析,比如温度传感器,虽然通信协议中没有给出数据头、数据尾、数据长度等信息,但是其实它返回的数据格式几乎都是固定的,我们只要按照这个固定格式去解析即可。

2023-06-10 16:35:22 1608

原创 2022年都快结束了,还有人不会安卓录屏?在安卓上录制屏幕的的实现方式

自此,在安卓中录屏的方法已经全部介绍完毕。实际上,同样的原理我们也可以用于实现截图。截图和录屏不同的地方在于,创建虚拟屏幕时改为使用创建,然后就可以从获取到 Bitmap。

2023-05-26 21:44:04 1851 3

原创 安卓动画壁纸实战:制作一个星空动态壁纸(带随机流星动画)

通过上面的代码可以看到,其实安卓的动态壁纸并没有想象中的那么困难,无非就是自定义绘制这一套,如果熟悉自定义绘制的话,写起来还是非常容易的。不过我们这里只展示了使用 Canvas 的绘制,事实上,由 SurfaceHolder 我们可以有更多的"骚操作",例如调用第三方成熟的动画库直接刷新 Surface 等,感兴趣的可以去搜一搜。

2023-05-26 21:43:05 2086 1

原创 使用 Kotlin 的 Opt-in (选择加入)功能注解API提示当前非稳定API

根据官方文档介绍。Opt-in 是 Kotlin 标准库中的一个方法,用于声明使用某些 API 需要明确的同意。该功能可以让开发者告知 API 使用者使用某些 API 需要一些特定的条件,如果使用者已经知晓则需要明确声明依旧使用(Opt-in)才能继续使用该 API。例如,某些 API 尚处于测试阶段,未来可能会发生变化;亦或是我前言中提到的场景,都非常适合使用该方法。

2023-05-26 21:41:33 1626

原创 初探 Compose for Wear OS:实现一个简易选择APP

Wear OS 同样是基于 Android 系统,只不过它为手表或者说可穿戴设备做了专门的优化。正因为 Wear OS 基于 Android ,所以我们甚至可以直接将原本移动应用的代码直接复用到 Wear OS 上,但是,Wear OS 不适合,也不应该用于处理繁重的任务。只针对关键任务进行设计。由于 Wear OS 搭载的设备都是可穿戴设备,所以用户可能无法长时间舒适的去操作设备。所以我们在开发应用时应该充分考虑到这一特性,尽可能简化应用操作,让用户只需要几秒钟就能完成操作。此即针对腕部佩戴进行优化。

2023-05-26 21:40:58 1395 1

原创 Compose 没有 inputType 怎么过滤(限制)输入内容?这题我会!

虽然在 Compsoe 中官方没有提供类似于 EditText 中的 inputType 的预设输入内容过滤,但是得益于 Compose 的声明式 UI,在 Compose 中过滤输入内容更加简单,都不需要太多繁琐的步骤,因为我们可以直接操作输入的内容。本文就由浅入深的介绍了如何在 Compose 中快速实现类似于安卓原生 View 中的 inputType 输入内容过滤的方法,并且提供了几种常用的过滤供大家使用。

2023-05-26 21:39:11 1351

原创 为 Kotlin 的函数添加作用域限制(以 Compose 为例)

其实对于咱们程序员来说,不管学的是什么语言,对于作用域应该都是有一个了解的。这段代码不用运行都知道肯定会报错,因为在函数 a 中无法访问valueB;在函数 b 中无法访问valueA。但是这两个函数都可以成功访问valueFile。这是因为valueFile的作用域是整个 .kt 文件,也就是说,只要是在这个文件中的代码,都可以访问到它。而valueA和valueB的作用域则分别是在函数 a 和 b 中,显然只能在各自的作用域中使用。

2023-05-26 21:37:40 761

原创 Kotlin 中的高阶函数及其应用

因为我讲的比较浅显,读者可能看起来会一头雾水,所以这里推荐结合下面列出的参考资料的文章一起看,同时自己上手敲一敲,就能很好的理解了。

2023-05-26 21:36:44 1706

原创 Kotlin 协程中的并发问题:我明明用 mutex 上锁了,为什么没有用?

Mutex 是在 kotlin 协程中用于替代 java 线程中或的类,用于为不应该被多个协程同时执行的代码上锁,例如为前面例子中的count自增代码上锁,这样可以保证它在同一时间点只会被一个协程执行,从而避免了由于多线程导致的数据修改问题。Mutex 有两个核心方法:lock()和unlock()${Threadname……1000可以看到,虽然协程运行在不同的线程,但是依然能够正确的对count进行修改操作。这是因为我们在修改count值时调用了。

2023-05-26 21:35:53 1866

原创 Kotlin & Compose Multiplatform 跨平台(Android端、桌面端)开发实践之使用 SQLDelight 将数据储存至数据库

首先,SQLDelight 是什么东西呢?先来看官方的介绍:简单说就是一个能让我们在 Kotlin 中使用 SQL 更方便的一个库。如果还是不太理解的话,你可以把它当成支持跨平台的 Room。虽然它俩好像就没有多少相似之处,哈哈哈。并且,不像 Room,提供了几个常用的查询语句(Insert、Update、Delete 等),可以直接使用,SQLDelight 的所有查询语句都需要自己手写。

2023-05-26 21:35:00 3898 3

原创 安卓与串口通信-校验篇

奇偶校验,主要用于串口一帧(1字节)数据的校验,这意味着每字节数据都需要额外添加校验位,所以通常使用时都会选择无校验。CRC校验,由于CRC校验的相对来说更加可靠,而且校验的是整体的数据而非单比特数据,所以实际使用时通常会使用到它。当然,这篇文章中介绍的只是几个常见的校验方法,还有更多校验方法这里没有说到,如果有需要的话欢迎补充。

2023-05-21 09:36:48 1937

原创 安卓与串口通信-实践篇

众所周知,安卓其实是基于 Linux 的操作系统,所以在安卓中对于串口的处理与 Linux 一致。在 Linux 中串口会被视为一个“设备”,并体现为/dev/ttys文件。/dev/ttys又被称为字符终端,例如ttys0对应的是 DOS/Windows 系统中的 COM1 串口文件。通常,我们可以简单理解,如果我们插入了某个串口设备,则这个设备与 Linux 的通信会由/dev/ttys文件进行 “中转”。即,如果 Linux 想要发送数据给串口设备,则可以通过往/dev/ttys。

2023-05-21 09:36:26 3549

原创 安卓与串口通信-modbus篇

Modbus 是一种应用层报文传输协议,由 Modicon 公司在 1979 年发布,是为了解决 PLC 通信而研发的协议。因为 Modbus 是开源的且无著作权要求、易于部署维护、可靠性强的特性,所以 Modbus 已经成为工业领域通信协议事实上的业界标准,并且现在是工业电子设备之间常用的连接方式。由于 Modbus 定义的只是应用层的报文协议,所以它可以使用串口(RS232、RS485)、以太网作为物理层接口。Modbus 分为三种传输模式:RTU、ASII、TCP。

2023-05-21 09:36:02 2127

原创 安卓与串口通信-基础篇

自此我们已经对串口通信有了一个基本的认识。从上文中我们可以发现,UART定义了数据传输格式标准,RS232和RS485定义物理层面的数据传输方式与接线方式:也就是说,无论是串口通信还是 RS232 还是 RS485,其实它们的数据格式与内容都是一样的。对于我们安卓开发人员来说,无论使用什么标准几乎都对我们没有影响,我们需要做的只是解析好通过串口传输过来的数据即可。在 Windows 上进行模拟测试相对于 MAC 上简单的多。

2023-05-21 09:34:33 3423

原创 Compose For Desktop 实践:使用 Compose-jb 做一个时间水印助手

Compose-jb 让原本的移动端开发者也能很方便的进行桌面端开发,但是毕竟 Compose 只是一个 UI 工具包,对于实际的业务逻辑代码,还是需要调用原生 API 来实现。好在 Kotlin 是 jvm 语言,并且 Compose-jb 的实现也是基于 java 的 Swing ,也就是说对于安卓开发者来说,即使很多逻辑需要调用的也只是 Swing API ,对于安卓开发来说,基本没有什么门槛,看一下文档基本就能上手写了。

2023-05-21 09:33:48 1176

原创 安卓动画壁纸实战:制作一个星空动态壁纸(带随机流星动画)

通过上面的代码可以看到,其实安卓的动态壁纸并没有想象中的那么困难,无非就是自定义绘制这一套,如果熟悉自定义绘制的话,写起来还是非常容易的。不过我们这里只展示了使用 Canvas 的绘制,事实上,由 SurfaceHolder 我们可以有更多的"骚操作",例如调用第三方成熟的动画库直接刷新 Surface 等,感兴趣的可以去搜一搜。

2023-05-21 09:32:54 1166

原创 Compose太香了,不想再写传统 xml View?教你如何在已有View项目中混合使用Compose

modifierModifier 这个不用过多介绍columns表示一行需要放多少个 itemcontent放置于其中的 itam布局的实现也很简单,首先由于每个子 item 的宽度都是一致的,所以我们直接定义 item 宽度为当前布局的最大可用尺寸除以一行的 item 数量:。然后创建一个 Array 用于存放每一列的当前高度,方便后面摆放时计算位置:。接下来遍历所有子项。并使用绝对坐标放置子项,且 x 坐标为 宽度乘以当前列, y 坐标为 当前列高度。最后将高度累加并更新列数到下一列。

2023-05-21 09:31:46 1438

原创 跟我一起使用 compose 做一个跨平台的黑白棋游戏(4)移植到compose-jb实现跨平台

截止到现在,我们终于完成了所有的界面和逻辑代码,并且成功移植到了 compsoe-jb 实现了跨平台运行。但是还有亿些小细节需要我们好好的优化一下,这个就留到下一篇文章了,或者如果能写的东西不多的话我就不再写一篇新文章了,我就直接把更新代码提交到 github 得了,所以欢迎大家 star 这个项目。

2023-05-21 09:31:20 1123

原创 跟我一起使用 compose 做一个跨平台的黑白棋游戏(2)界面布局

自此,咱们的界面布局就算完成了,虽然现在看起来可能简陋了点,但是现在还只是在验证可行性,等所有代码写完,我们再进行亿点点优化,就会丰富好看多了。对了,项目源码我将在这系列文章完结,也就是项目真正写完的时候上传到 Github,到时会在文中附上链接的。

2023-05-21 09:29:38 790

原创 跟我一起使用 compose 做一个跨平台的黑白棋游戏(3)状态与游戏控制逻辑

自此,所有游戏控制逻辑编写完成!现在这个游戏已经完全是可以玩的程度了,我也试了下,有点难度,不好下啊。界面布局不美观游戏提示功能还没做(这个其实很好做,获取到所有可以合法下子的格子,然后更新一个提示UI到棋盘上就可以了)逻辑上还有点问题,例如,当玩家已经无法继续下子时应该跳到AI下子或开始判定游戏结果,但是现在如果出现这种情况会直接"卡死"当然,这些问题都无伤大雅,所以我决定先暂时不去改这些,下一步我们先将其移植到桌面端,然后再慢慢的做亿点优化。

2023-05-21 09:29:25 1269

原创 跟我一起使用 compose 做一个跨平台的黑白棋游戏(1)整体实现思路

经过上面的分析和实践,证明不依赖安卓的 ViewModel 确实是可以实现 MVI 架构,这就意味着之后移植至 compose-jb 将更加方便。当然,本文只是简单的梳理了一下思路,从下一篇开始我们将正式开始编写。下一篇我们介绍怎么绘制棋盘和棋子,以及编写界面布局。

2023-05-20 23:14:51 1514 5

原创 基于Gitee的webhook编写hugo的自动构建实现博客自动更新

可以看到,其实添加自动构建非常简单,不过是一个脚本就能解决的事。但是就是这么一个小脚本,却能给我们节约无数的宝贵时间。对了,现在我博客的图片都是直接传到 Gitee 中,然后放到服务器的,虽然现在没问题,但是随着文章增大,要么是 Gitee 仓库达到限额,要么就是服务器被塞满图片或带宽被用完。所以下次有机会我再写一篇文章说说怎么搭建图床或者将图片插入到已有图床。

2023-05-20 23:13:49 816

原创 在安卓中压缩GIF的几种方法(附实例代码)

和静态图片以及视频一样,GIF文件的尺寸和分辨率呈正相关关系,分辨率越高需要储存的图像信息越多,所以GIF文件大小就会越大。因此我们可以通过降低GIF的分辨率来减小文件体积,但是实际上并不是所有场景都适用于减少分辨率。如果是表情包之类的GIF,那么就无所谓,只要还能看见就可以随意减少分辨率;如果是用于固定场景(例如商城头图)则不能随便改分辨率,因为在这些场景下对分辨率有严格要求。总的来说,为了降低GIF文件的大小,我们有以下几种方法:而这些方法都可以使用 Gifsicle 来实现。

2023-05-20 23:12:56 1861

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除