- 博客(190)
- 收藏
- 关注
原创 Jetpack - WorkManager
普通环境继承 Work,协程环境继承 CoroutineWorker。重写 doWork() 用于耗时任务,需要返回一个 Result 用于将任务结果通知给 WorkManager:success成功、failure失败、retry重试。
2025-04-27 12:03:00
103
原创 Compose 适配 - 大屏(响应式排版 & 自适应布局)
传统根据屏幕大小和方向做适配的方式已不再适用,APP的显示方式还可能是:手机平板的分屏、ChormeOS的窗口可调整大小、折叠设备的屏幕形态切换等显示方式,因此需要根据可用显示空间做适配。
2025-04-11 23:34:14
589
原创 Android Studio - 解决gradle文件下载失败
C:\Users\user.gradle\wrapper\dists(这里的user是你自己的用户名)。
2025-02-15 17:11:27
491
原创 Kotlin - 先决条件 Preconditions
以下函数,一个参数的重载默认了异常信息,两个参数的重载可以自定义异常信息。条件必须满足,代码才会继续往下执行。
2024-08-21 17:52:36
274
原创 Kotlin - 链式调用处理返回的结果 Result
参考文章success( )failure( )public inline fun <T> success(value: T): Result<T> = Result(value)//成功时调用,来包装返回的值。public inline fun <T> failure(exception: Throwable): Result<T> = Result(createFailure(exception))//失败时调用,来包装返回的异常。.isSuccess.isFailurepublic val isSuc
2024-08-21 17:34:08
1329
原创 Jetpack - CameraX
CameraX 解决了由于碎片化问题在不同机型上保持一致性体验的麻烦, 只需要关心 API 调用,不需要对不同机型做适配。CameraX 把不同的功能,如 预览、拍照等功能封装成不同的 UseCase,这样就可以根据业务的需要,来绑定不同的 UseCase 来实现具体的功能。不同设备的摄像头支持的宽高比可能不同,使用 RATIO_DEFAULT 可以自动选择最适合当前设备的宽高比。:保持宽高比,可能会在顶部或左侧留出空白。:保持宽高比,可能会在上下或左右留出空白。:保持宽高比,可能会在底部或右侧留出空白。
2024-07-26 20:03:46
244
原创 Compose - 权限申请
不同版本中,权限状态(如PermissionState)中获取属性的方法不同,例如在“0.23.1”中,通过 PermissionState.hasPermission 属性拿到是否通过的 Boolean 值,在“0.35.0-alpha”中,通过 PermissionState.status.isGranted 属性拿到。
2024-06-18 17:37:04
1537
原创 Compose 可组合项 - 日期选择 DatePicker、DatePickerDialog
onDismissRequest: () -> Unit, //关闭对话框回调confirmButton: @Composable () -> Unit, //确认按钮= null, //取消按钮properties: DialogProperties = DialogProperties(usePlatformDefaultWidth = false), //对话框配置,详见。
2024-06-17 17:43:24
1543
原创 Compose 可组合项 - 输入框 TextField、OutlinedTextField、BasicTextField
innerTextField 是输入框的实现,必须并且也只能调用一次这个函数,在 decorationBox 中通过自定义 innerTextField 的调用位置等方式实现自定义自己需要的文本框的目的。Sentences //当输入英文时候,将每个字母的第一个字符大写。Words //当输入英文的时候,将每个字母的第一个字符小写。Characters //将所有的字符大写。代码可设置的内容同 TextField 一样。None //不自动大小写。
2024-06-17 16:40:34
1693
原创 Compose 可组合项 - 抽屉式导航栏 NavigationDrawer
colors: NavigationDrawerItemColors = NavigationDrawerItemDefaults.colors(), //颜色。shape: Shape = NavigationDrawerTokens.ActiveIndicatorShape.toShape(), //形状。label: @Composable () -> Unit, //名称。onClick: () -> Unit, //点击回调。
2024-06-17 16:16:20
1232
原创 Compose 动画 - 共享元素过渡动画 SharedTransitionLayout
共享元素过渡是一种在内容之间具有一致的可组合项之间的无缝过渡方式。它们通常用于导航,当用户在这些屏幕之间导航时,可以直观地将不同的屏幕连接起来。结合 AnimatedContent() 或 AnimatedVisibility() 使用,将内容变化的动画交由系统处理。
2024-05-20 17:35:21
850
原创 Composable 自定义 - 一些自用控件的功能实现
针对的是给控件添加点击功能的场景(如Text),通过 Modifier 扩展函数实现。
2024-04-18 17:42:30
414
1
原创 优化 - 排序算法
从左往右比较相邻的两个元素,右比左小就换位,这样最大值就出现在了右边最后一个元素上,再从左边第一个元素开始往右比较到倒数第二个元素,如此重复...
2024-03-23 03:40:08
285
原创 Java - 数组 Array
数组长度不可改变,在处理固定大小数据的时候性能更好,有增删需求推荐使用 ArrayList,否则需要遍历旧数组对元素进行操作后存储到新数组中,或者遍历旧数组对目标元素位置后面的元素索引+1或-1即整体向前或向后移动1位。内循环一次,最值出现在尾部索引位置。有N个元素排序,外循环 N-1 次,内循环 N-i-1 次。适用于数组中元素数量较大时,但必须保证元素是排好序的(升序、降序)。从头到尾遍历,返回值在数组中第一次出现的位置(即使有相同的元素)。内循环一次,最值出现在头部索引位置。
2024-03-20 22:32:14
568
原创 Android - AIDL
定义接口声明功能,手动创建的是 .aidl 文件,调用 IDE 的 rebuild 生成 .java 文件。Module右键→New→AIDL→AIDL File(如果不可选,在 module 的 build.gradle 的 节点下的 节点中添加 aidl true)。在创建的接口中声明抽象方法(IDE生成的默认方法可以删掉,只能用 Java 语法写)。
2024-03-19 00:22:15
1172
原创 网络 - 基本知识
Cache-Control是服务器返回的 Response 中的 Header 所包含的信息,目的是告诉客户端从本地读取缓存还是从网络获取。(expires等同于Cache-Control,不过是 Http 1.0 的内容)
2024-02-24 16:07:11
468
原创 网络 - OkHttp
设置好Cache后,同一个地址访问两次打印Log:第一次访问的response.networkResponse( )有内容(来自网络)而response.cacheResponse( ) = null;第二次访问相反,response.cacheResponse( )有内容(来自缓存)而response.networkResponse( ) = null。当某些网络访问获取的内容是短时间不变的(每月榜单)或长时间不变的(歌曲的信息),每次访问都联网获取数据的话,会重复浪费用户和公司的流量费用和带宽占用。
2024-02-24 16:05:12
856
原创 Compose 自定义 - 约束 Constrains
是当前节点宽高的上下界(最大值和最小值)。在 Layout 阶段,当父节点测量子节点的时候会把 Contraints 往下传递,好让子元素知道自己被允许的最大最小尺寸,当所有子元素被测量完成后开始决定自身尺寸时,同样的需要考虑自身的父容器给出的约束。
2024-02-17 00:28:25
517
原创 Compose 自定义 - 数据转UI的三阶段(组合、布局、绘制)
这是一个很简单的例子,事实上 Composable 可以包含逻辑和控制流(if else, when...),在不同的状态下产生不同的UI树。同样地,UI树会自顶向下地遍历,每个节点依次在屏幕上绘制自身。然后 Image 绘制自身,再之后到分支节点Column,Column的第一个Text,Column的第二个Text。多叉树中父节点会测量他们的子节点,然后在一个二维空间里进行摆放。2.测量完子节点后,开始决定自身的尺寸。1.如果存在子节点则测量子节点。3.根据子节点的尺寸摆放子节点。
2024-02-16 21:43:58
1052
原创 Framework - ActivityThread 应用启动UI渲染流程
拥有 main(String[] agrs) 方法,作为程序的入口,是应用程序的初始化类。
2024-02-02 20:17:21
799
原创 View 自定义 - 组合已有控件
现有的控件已经有了自己的正确尺寸算法,结果可以作为参考值根据我们的需求进行调整。自定义子类继承自已有的控件。重写 onMeasure(),调用 super.onMeasure() 进行一次原有的测量,通过 getMeasuredHeight()、getMeasuredWidth() 获取测量结果并修改成想要的值。最终调用 setMeasuredDimension() 保存。
2024-01-18 21:01:34
1001
原创 View 自定义 - View 体系和方法
View这个类代表用户界面组件的基本构建块。View在屏幕上占据一个矩形区域,并负责绘制和事件处理。View是用于创建交互式用户界面组件(按钮、文本等)的基础类。它的子类ViewGroup是所有布局的父类,它是一个可以包含其他view或者viewGroup并定义它们的布局属性的看不见的容器。单参构造:代码中 new 创建实例的时候调用。双参构造:xml中使用时调用(xml转java代码的时候反射),attrs是xml中的属性。三参构造:使用主题Style的时候调用。
2024-01-16 19:06:05
903
原创 Android 架构 - 模块化 Modularization
模块指 Android 项目中的 module,通常会包含 Gradle 构建脚本、源代码、资源等,模块可以独立构建和测试。相反,如果一个模块的两个部分不经常交互,它们可能应该是单独的模块。:数据模块的公共 API 应该是 Repository,因为它们负责将数据公开给 App 的其余部分。:工具类,也称为帮助类,通常是在应用程序中重用的小段代码。:网络库模块,通常是对三方网络库(如 OhHttp)的封装,简化自定义配置时,减少不必要的重复代码。也称为核心模块或者基础模块,包含其他模块经常使用的代码。
2024-01-08 02:14:02
833
原创 Android 架构 - 组件化 Componentization
继承自 lib_common 中提供的 BaseApplication,组件自定义的 Application 写在 debug 目录中,在集成模式下剔除。(别忘了在下方 debug 目录中的 AndroidManifest 中注册)
2024-01-03 16:22:09
3825
4
原创 Compose 可组合项 - 滑动列表 LazyColumn、LazyRow
可滚动,类似RecyclerView( Column、Row 用 Modifier 设置滚动是相当于ScrollView)。
2023-12-20 17:50:53
3666
原创 Android 架构 - MVVM
View→ViewModel:View作为观察者,监听ViewModel中数据(LiveData、Flow)的变化从而自动更新UI。ViewModel→Model:ViewModel调用Model获取数据。ViewModel→View:ViewModel作为被观察者,当数据发生变化时,调用接口通知订阅者View更新。
2023-12-17 20:07:24
603
原创 Android - 分区存储 MediaStore、SAF
绝大部分的应用程序都不应该申请这个权限,仅适用于 文件浏览器 类APP,需要跳转到系统页面让用户手动授权,Play商店上架也会更严格。即便得到授权也只能访问 公有目录 + 自定义目录,依然无法访问私有目录。//不加 ignore 属性 AndroidStudio 会用警告提醒。//系统低于11或者方法返回true说明已经拥有整个SD卡管理权限Toast.makeText(this, "已获得访问所有文件权限", Toast.LENGTH_SHORT).show()} else {
2023-12-12 05:55:51
2238
原创 设计模式 - 概览
分为三大类、23中具体设计模式。单例模式工厂方法模式抽象工厂模式建造者模式原始模式类结构:采用继承机制来组合接口实现。对象结构:组合对象来实现新功能。适配器模式代理模式门面模式桥梁模式装饰模式合成模式享元模式类行为:使用继承关系在几个类之间分配行为。对象行为:使用对象聚合的方式来分配行为。观察者模式策略模式模板方法模式命令模式迭代器模式调停者模式状态模式责任链模式访问者模式备忘录模式解释器模式。
2023-11-17 23:35:03
435
原创 View 自定义 - 构造和属性 Constructor & Attribute
右键 values 目录 -> New File文件 -> 一般取名attrs.xml。--name使用自定义View的名称-->--name属性名称,format格式-->--枚举-->
2023-11-08 22:41:33
707
原创 Compose - 使用 Paging
是对其它数据源的封装,因此和 Repository 定义在同一个 .kt 文件中并私有化。自定义一个类继承 PagingSource 并重写 load() 来提供获取页面数据。}.flow//具体获取数据的方法。这里能更细分的对异常处理,否则在load()中合并返回后在UI中难区分。//但处理后还是要抛出异常,不然load()不会返回异常,影响UI中对Paging状态判断Log.e("服务器错误", it.message.toString())
2023-11-07 17:29:56
1061
原创 Compose 可组合项 - 下拉刷新 pullRefresh()、PullToRefreshBox()
功能实现采用的是 Modifier 修饰符而不是一个单独的组合项,所以需要提供一个父容器来存放列表和下拉指示器。需求是下拉指示器显示在列表之上,因此选择 Box。
2023-11-04 04:16:36
1276
原创 Compose 自定义 - 绘制 Draw
对于自定义绘制,官方为我们提供了三个 Modifier API。在 Lambda 中调用 drawContent() 就是绘制所修饰的内容,由此控制先后顺序,后绘制的会显示在上面。修饰的内容会显示在 Lambda 内容之上(底层是先绘制 Lambda 内容再绘制所修饰的内容,后绘制的会显示在上面)。当绘制复杂效果时,不希望因为重组而重新创建 Lambda 中用于绘制的实例如 Bush、Path 等,这可能会产生内存抖动。
2023-10-28 02:22:29
881
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人